var fieldLength = 65;
var divArray = new Array;
var tipBuff  = {};
var links    = {};

function findPosX(obj){
  var curleft = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  }
  else if (obj.x) curleft += obj.x;
  return curleft;
}

function findPosY(obj){
  var curtop = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
            curtop += obj.offsetTop
            obj = obj.offsetParent;
    }
  }
  else if (obj.y) curtop += obj.y;
  return curtop;
}
function resize(){
        var obj1=document.getElementById("daily");
        var obj2=document.getElementById("pos");
         obj1.style.left = findPosX(obj2)+65;

}

function getShortTripTitle( str, len ){
  var tmp = "";
  if ( len > 5){
    for (k = 0; k < len; k++){
      if ( str[k] != undefined){
        tmp += str[k];
      }
    }
  }
  tmp += "...";
  return tmp;
}

function clearItemsCountArray(){
  if (itemsCount != undefined){
    itemsCount = new Array;
  }
  if ( divArray != undefined){
    for (j = 0; j < divArray.length; j++){
      div = document.getElementById(divArray[j]);
      document.body.removeChild(div);
    }
    divArray = new Array;
  }
}
function fillItemsCount( duration, d, m, y ){
  day     = new String(d);
  month   = new String(m);
  year    = new String(y);
  var index = "";
  for (j = d; j < d + duration; j++){
    nextDay = String(j);
    index = year + "-" + (month.length == 1 ? "0" + month : month) + "-";
    index += (nextDay.length == 1 ? "0" + nextDay : nextDay);
    if ( itemsCount[ index ] == undefined ){
      itemsCount[ index ] = 1;
    }
    else {
      itemsCount[ index ]++;
    }
  }
}


function getDY( duration, d, m, y ){
  day     = new String(d);
  month   = new String(m);
  year    = new String(y);
  var index = "";
  var maxDY = 1;
  for (j = d; j < d + duration; j++){
    nextDay = String(j);
    index = year + "-" + (month.length == 1 ? "0" + month : month) + "-";
    index += (nextDay.length == 1 ? "0" + nextDay : nextDay);
    if (itemsCount[index] != undefined){
      if (maxDY < itemsCount[index]){
        maxDY = itemsCount[index];
      }
    }
  }
  //alert(duration + " " + maxDY * 16);
  return maxDY * 16;
}

function getWeeksAmount( daysAmount, dx ){
  var ret = Math.ceil((daysAmount + dx)/7);
  return ret;
  /*
  if (daysAmount == 31 && dx >= 5){
    return 6;
  }
  else {
    if (daysAmount == 28 && dx > 0){
      return 5;
    }
    else if (daysAmount == 30 && dx == 6){
      return 6;
    }
    else {
      return Math.ceil(daysAmount / 7);
    }
  }
  */
}



function displaySection( data ){
  var nullPointID = data['startDate'];
  if ( document.getElementById(nullPointID) == undefined ) return;
  var newSection = document.createElement('div');
  var date = new Date();
  var divID = date.getTime();
  data['link'] == '' ? tripLink = "javascript:void(0);" : tripLink = data['link'];
  links[divID] = data['link'];

  tipBuff[divID] = data['title'];
  divArray[ divArray.length ] = divID;
  newSection.setAttribute('id', divID);
  newSection.setAttribute('name', divID);
  newSection.setAttribute('align', "center");
  newSection.style.position = "absolute";
  newSection.style.cursor   = "pointer";
  newSection.className = data['class'];
  newSection.mouseChildren = false;
  newSection.onmouseover    = function (){Tip(tipBuff[divID], BALLOON, true, ABOVE, true);};
  newSection.onmouseout     = function (){ UnTip(); };
  newSection.onclick        = function (){document.location.href = links[divID];};
  var leftArrow   = '<img src="/www/assets/images/default/arrow2_.gif" border="0" align="absmiddle"/>&nbsp;&nbsp;';
  var rightArrow  = '&nbsp;&nbsp;<img src="/www/assets/images/default/arrow1_.gif" border="0" align="absmiddle"/>';

  if ( data['title'].length > data['duration'] * 7){
    tripTitle = getShortTripTitle( data['title'], data['duration'] * 5 );
  }
  else {
    tripTitle = data['title'];
  }


  newSection.innerHTML = '<a href="' + tripLink + '" title="' + data['title'] + '" class="' + data['class'] + '">' + tripTitle + '</a>';

  if ( data['displayLeftArrow'] ){
    var html = newSection.innerHTML;
    newSection.innerHTML = leftArrow + html;
  }
  if (data['displayRigthArrow']){
    newSection.innerHTML += rightArrow;
  }

  fillItemsCount(data['duration'], data['startDay'], data['startMonth'], data['startYear']);
  dy = getDY( data['duration'], data['startDay'], data['startMonth'], data['startYear'] );

  newSection.style.width = data['duration'] * fieldLength + (data['duration'] > 1 ? data['duration'] * 2 : 0 );
  //alert(nullPointID + "   " + document.getElementById(nullPointID));
  newSection.style.left  = findPosX( document.getElementById(nullPointID) ) + 0;
  newSection.style.x     = findPosX( document.getElementById(nullPointID) ) + 0;
  newSection.style.top   = findPosY( document.getElementById(nullPointID) ) + dy;
  newSection.style.y     = findPosY( document.getElementById(nullPointID) ) + dy;
  newSection.style.display = "";
  document.body.appendChild( newSection );

}//function








function displayTrips( sub ){
  if ( sub != undefined ){
    /**
     * from subSection
     **/
    var data = {};
    data['startDate']                     = sub['startDate'];
    data['startDay']                      = sub['startDay'];
    data['startMonth']                    = sub['startMonth'];
    data['startYear']                     = sub['startYear'];
    data['currentMonthFirstDayDX']        = sub['currentMonthFirstDayDX'];
    data['nextMonthFirstDayDX']           = sub['nextMonthFirstDayDX'];
    data['monthDaysAmount']               = sub['monthDaysAmount'];
    data['nextMonthDaysAmount']           = sub['nextMonthDaysAmount'];
    data['allowNextMonthJump']            = sub['allowNextMonthJump'];
    data['title']                         = sub['title'];
    data['link']                          = sub['link'];
    data['class']                         = sub['class'];
    data['displayRigthArrow']             = false;
    var lastWeek                          = getWeeksAmount( data['monthDaysAmount'], data['currentMonthFirstDayDX']);
    var currentSectionWeek                = Math.ceil((data['startDay'] + data['currentMonthFirstDayDX']) / 7);
    var lastWeekDate                      = currentSectionWeek * 7 - data['currentMonthFirstDayDX'];
    var currentSectionDurationLimit       = ( currentSectionWeek == lastWeek ? (data['monthDaysAmount'] - data['startDay'] + 1) : ( lastWeekDate - data['startDay'] + 1 ));
    //if ( sub['startDate'] == '2008-11-23') console.log(data['monthDaysAmount'], data['currentMonthFirstDayDX']);
    if (sub['duration'] > currentSectionDurationLimit){
      /**
       * preparig subSection data
       **/
      data['duration']                    = currentSectionDurationLimit;
      data['displayRigthArrow']           = true;
      if (sub['allowNextMonthJump'] || currentSectionWeek < lastWeek){
        sub2 = {};
        sub2['duration']                  = sub['duration'] - currentSectionDurationLimit;
        //if (lastWeekDate == data['monthDaysAmount']){
        if ( currentSectionWeek == lastWeek){
          /**
           * if last week then jump to next month, consideration next year jump
           **/
          if (data['startMonth'] == 12){
            sub2['startMonth']            = 1;
            sub2['startYear']             = data['startYear'] + 1;
          }
          else {
            sub2['startMonth']            = data['startMonth']+ 1;
            sub2['startYear']             = data['startYear'];
          }
          sub2['startDay']                = 1;
          sub2['currentMonthFirstDayDX']  = data['nextMonthFirstDayDX'];
          sub2['monthDaysAmount']         = data['nextMonthDaysAmount'];
          sub2['nextMonthFirstDayDX']     = 0;
          sub2['nextMonthDaysAmount']     = 0;
        }
        else {
          /**
           * continue this week
           **/
          sub2['startDay']                = lastWeekDate + 1;
          sub2['startMonth']              = data['startMonth'];
          sub2['startYear']               = data['startYear'];
          sub2['currentMonthFirstDayDX']  = data['currentMonthFirstDayDX'];
          sub2['monthDaysAmount']         = data['monthDaysAmount'];
          sub2['nextMonthFirstDayDX']     = data['nextMonthFirstDayDX'];
          sub2['nextMonthDaysAmount']     = data['nextMonthDaysAmount'];
        }
        sub2['title']                     = data['title'];
        sub2['link']                      = data['link'];
        sub2['class']                     = data['class'];
        sub2['displayRigthArrow']         = false;
        sub2['displayLeftArrow']          = true;
        sub2['allowNextMonthJump']        = data['allowNextMonthJump'];
        sub2['startDate']                 = String(sub2['startYear']) + "-" + (sub2['startMonth'] < 10 ? "0" + String(sub2['startMonth']) : String( sub2['startMonth'] )) + "-" + (sub2['startDay'] < 10 ? "0" + String(sub2['startDay']) : String( sub2['startDay'] ));
        displayTrips( sub2 );
      }//if allow next month jump
    }
    else {
      data['duration']                    = sub['duration'];
    }
    data['displayLeftArrow']              = sub['displayLeftArrow'];
    displaySection( data );
  }
  else {
    subsections = new Array();
    /**
     * from global trips array
     **/
    for (i = 0; i < trips.length; i++){
      var data = {};
      data['startDate']                     = trips[i]['startDate'];
      data['startDateAsNumber']             = data['startDate'].replace(date2numberRegexp,'');
      //console.log(data['startDateAsNumber'],filterFromDate,trips[i]['title']);
      data['startDay']                      = trips[i]['startDay'];
      data['startMonth']                    = trips[i]['startMonth'];
      data['startYear']                     = trips[i]['startYear'];
      data['currentMonthFirstDayDX']        = trips[i]['currentMonthFirstDayDX'];
      data['nextMonthFirstDayDX']           = trips[i]['nextMonthFirstDayDX'];
      data['monthDaysAmount']               = trips[i]['monthDaysAmount'];
      data['nextMonthDaysAmount']           = trips[i]['nextMonthDaysAmount'];
      data['allowNextMonthJump']            = trips[i]['allowNextMonthJump'];
      data['title']                         = trips[i]['title'];
      data['link']                          = trips[i]['link'];
      data['class']                         = trips[i]['class'];
      data['displayRigthArrow']             = false;
      var lastWeek                          = getWeeksAmount( data['monthDaysAmount'], data['currentMonthFirstDayDX']);
      var currentSectionWeek                = Math.ceil((data['startDay'] + data['currentMonthFirstDayDX']) / 7);
      var lastWeekDate                      = currentSectionWeek * 7 - data['currentMonthFirstDayDX'];
      if ( lastWeekDate > data['monthDaysAmount'] ) lastWeekDate = data['monthDaysAmount'];
      //fixed
      //var currentSectionDurationLimit       = ( currentSectionWeek == lastWeek ? data['monthDaysAmount'] : ( lastWeekDate - data['startDay'] + 1 ));
      var currentSectionDurationLimit       = lastWeekDate - data['startDay'] + 1;

      if (trips[i]['duration'] > currentSectionDurationLimit){
        /**
         * preparig subSection data
         **/
        data['duration']                    = currentSectionDurationLimit;
        data['displayRigthArrow']           = true;

        if (trips[i]['allowNextMonthJump'] || currentSectionWeek < lastWeek){
          sub = {};
          sub['duration']                   = trips[i]['duration'] - currentSectionDurationLimit;
          //if (lastWeekDate == data['monthDaysAmount']){
          if ( currentSectionWeek == lastWeek){
            /**
             * if last week then jump to next month, consideration next year jump
             **/
            if (data['startMonth'] == 12){
              sub['startMonth']             = 1;
              sub['startYear']              = data['startYear'] + 1;
            }
            else {
              sub['startMonth']             = data['startMonth'] + 1;
              sub['startYear']              = data['startYear'];
            }
            sub['startDay']                 = 1;
            sub['currentMonthFirstDayDX']   = data['nextMonthFirstDayDX'];
            sub['monthDaysAmount']          = data['nextMonthDaysAmount'];
            sub['nextMonthFirstDayDX']      = 0;
            sub['nextMonthDaysAmount']      = 0;
          }
          else {
            /**
             * continue this week
             **/
            sub['startDay']                 = lastWeekDate + 1;
            sub['startMonth']               = data['startMonth'];
            sub['startYear']                = data['startYear'];
            sub['currentMonthFirstDayDX']   = data['currentMonthFirstDayDX'];
            sub['monthDaysAmount']          = data['monthDaysAmount'];
            sub['nextMonthFirstDayDX']      = data['nextMonthFirstDayDX'];
            sub['nextMonthDaysAmount']      = data['nextMonthDaysAmount'];
          }
          sub['title']                      = data['title'];
          sub['link']                       = data['link'];
          sub['class']                      = data['class'];
          sub['displayRigthArrow']          = false;
          sub['displayLeftArrow']           = true;
          sub['allowNextMonthJump']         = data['allowNextMonthJump'];
          sub['startDate']                  = String(sub['startYear']) + "-" + (sub['startMonth'] < 10 ? "0" + String(sub['startMonth']) : String( sub['startMonth'] )) + "-" + (sub['startDay'] < 10 ? "0" + String(sub['startDay']) : String( sub['startDay'] ));
          displayTrips( sub );
        }//if allow next month jump
      }
      else {
        data['duration'] = trips[i]['duration'];
      }
      data['displayLeftArrow']        = trips[i]['displayLeftArrow'];
      displaySection( data );
    }//for
  }
}//function
