var fixedX = -1;
var fixedY = -1;
var crossobj, monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, ctlToPlaceValue, ctlNow, dateFormat, nStartingYear;
var bPageLoaded = false;
var today = new Date();
var dateNow  = today.getDate();
var monthNow = today.getMonth();
var yearNow  = today.getYear();
if (String(yearNow).length < 4) yearNow += 1900;
var bShow = false;
var checkInDate = false;

/*** For language packs, month/day names should be changed here  ***/
var monthName = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct","Nov", "Dec")
var dayName = new Array("M","T","W","T","F","S","S")

var ie = document.all;
var dom = document.getElementById;
var ns4 = document.layers;

DocumentRegisterEvents();

/* hides <select> and <applet> objects (for IE only) */
function hideCalElement(elmID, overDiv) {
  if (!ie) return;
  for (i = 0; i < document.all.tags( elmID ).length; i++) {
    obj = document.all.tags(elmID)[i];
    if(!obj || !obj.offsetParent) continue;

    // Find the element's offsetTop and offsetLeft relative to the BODY tag.
    objLeft   = obj.offsetLeft;
    objTop    = obj.offsetTop;
    objParent = obj.offsetParent;

    while (objParent.tagName.toUpperCase() != "BODY") {
      objLeft  += objParent.offsetLeft;
      objTop   += objParent.offsetTop;
      objParent = objParent.offsetParent;
    }

    objHeight = obj.offsetHeight;
    objWidth = obj.offsetWidth;

    if ((overDiv.offsetLeft + overDiv.offsetWidth) <= objLeft);
    else if ((overDiv.offsetTop + overDiv.offsetHeight) <= objTop);
    else if (overDiv.offsetTop >= (objTop + objHeight));
    else if (overDiv.offsetLeft >= (objLeft + objWidth));
    else {
      obj.style.visibility = "hidden";
    }
  }
}

/*
 * unhides <select> and <applet> objects (for IE only)
 */
function showCalElement(elmID) {
  if (!ie) return;
  for (i = 0; i < document.all.tags(elmID).length; i++) {
    obj = document.all.tags(elmID)[i];

    if (!obj || !obj.offsetParent) continue;

    obj.style.visibility = "";
  }
}

if (dom) {
  // ==> quick dirty hack against google maps v2 assigning it's own class and styles to the first div of the body
  document.write ("<div style='display:none;'></div>");
  // <== quick dirty hack against google maps v2 assigning it's own class and styles to the first div of the body
  document.write ("<div id='calendar' class='div-style'>\n");
  document.write ("<table width='140' class='table-style'>\n");
  document.write ("<tr class='title-background-style' >\n");
  document.write ("       <td width='100%'>\n");
  document.write ("       <table width='100%'>\n");
  document.write ("               <tr>\n");
  document.write ("                       <td class='title-style'>\n");
  document.write ("                               <span id='calendar_caption'></span>\n");
  document.write ("                       </td>\n");
  document.write ("               </tr>\n");
  document.write ("               </table>\n");
  document.write ("       </td>\n");
  document.write ("</tr>\n");
  document.write ("<tr>\n");
  document.write ("       <td width='100%' class='body-style'>\n");
  document.write ("               <span id='calendar_content'></span>\n");
  document.write ("       </td>\n");
  document.write ("</tr>");
  document.write ("</table>")
  document.write ("</div>");
}

function hideCalendar() {
  if (crossobj) crossobj.visibility = "hidden";
  showCalElement('SELECT');
  showCalElement('APPLET');
}

function padZero(num) {
  return (num < 10)? '0' + num : num;
}

function constructDate(d,m,y) {
  var shorty = String(y).substr(2, 3);
  sTmp = dateFormat;
  sTmp = sTmp.replace("dd", "<e>");
  sTmp = sTmp.replace("d", "<d>");
  sTmp = sTmp.replace("<e>", padZero(d));
  sTmp = sTmp.replace("<d>", d);
  sTmp = sTmp.replace("mmm", "<o>");
  sTmp = sTmp.replace("mm", "<n>");
  sTmp = sTmp.replace("m", "<m>");
  sTmp = sTmp.replace("<m>", m+1);
  sTmp = sTmp.replace("<n>", padZero(m+1));
  sTmp = sTmp.replace("<o>", monthName[m]);
  sTmp = sTmp.replace("yyyy", y);
  return sTmp.replace("yy", shorty);
}

function closeCalendar() {
  var sTmp;

  hideCalendar();
  ctlToPlaceValue.value = constructDate(dateSelected, monthSelected, yearSelected)
  ctlToPlaceValue.focus();
}

function incMonth () {
  monthSelected++;
  if (monthSelected > 11) {
    monthSelected = 0;
    yearSelected++;
  }
  constructCalendar();
}

function decMonth () {
  monthSelected--;
  if (monthSelected < 0) {
    monthSelected = 11;
    yearSelected--;
  }
  constructCalendar();
}

/*** calendar ***/

function constructCalendar () {
  var dateMessage;
  var startDate = new Date(yearSelected, monthSelected, 1);
  var endDate = new Date(yearSelected, monthSelected+1, 1);
  endDate = new Date(endDate - (24*60*60*1000));
  numDaysInMonth = endDate.getDate();

  var today = new Date;
  var weekDaysSequence, startAt;
  
  var dateFormat = (typeof(__stuffed) == "object" && __stuffed.dateFormat == "us" ? "us" : "euro");
  if (dateFormat == "us") {
  	startAt = 0;
	weekDaysSequence = [6, 0, 1, 2, 3, 4, 5];
  } else {
  	startAt = 1;
  	weekDaysSequence = [0, 1, 2, 3, 4, 5, 6];
  }
	
  datePointer = 0;
  dayPointer = startDate.getDay() - startAt;
  if (dayPointer < 0) dayPointer = 6;

  sHTML = "<table width='100%' border='0' cellpadding='1' cellspacing='1' class='body-style'><tr>";

  for (i = 0; i <= 6; i++) {
    sHTML += "<td width='15' align='center'><B>"+dayName[weekDaysSequence[i]]+"</B></td>"
  }
  sHTML +="</tr><tr>"

  for (var i = 1; i <= dayPointer; i++) {
    sHTML += "<td>&nbsp;</td>";
  }

  var today = new Date();
  today.setHours(0);
  today.setMinutes(0);
  today.setSeconds(0);
  today.setMilliseconds(0);

  var selectedDate = new Date(oyearSelected, omonthSelected, odateSelected, 0, 0, 0, 0);
  for (datePointer = 1; datePointer <= numDaysInMonth; datePointer++) {
    dayPointer++;
    sHTML += "<td width='15' align='center'>";

    var sStyle="normal-day-style"; //regular day

    var currentDate = new Date(yearSelected, monthSelected, datePointer, 0, 0, 0, 0);

    // this appears to be a bug in Date object? It compares 2 dates objects
    // incorrectly when we trying to find if they are equal (==), so we do
    // this deduction thing instead
    if ((currentDate - today) == 0) sStyle = "current-day-style"; 

    //selected day
    if ((currentDate - selectedDate) == 0) sStyle += " selected-day-style"; 

    if (currentDate >= today && currentDate >= checkInDate) {
      sHTML += "<a class='"+sStyle+"' href='javascript:dateSelected="+datePointer+";closeCalendar();'>";
    } else {
      sHTML += '<span class="disabled-day-style">';
    }

    sHTML += datePointer;
    if (currentDate >= today && currentDate >= checkInDate) {
      sHTML += "</a>";
    } else {
      sHTML += "</span>"
    }
    if ((dayPointer + startAt) % 7 == startAt) {
      sHTML += "</tr><tr>"
    }
  }

  document.getElementById("calendar_content").innerHTML = sHTML;
  document.getElementById("spanMonth").innerHTML = monthName[monthSelected];
  document.getElementById("spanYear").innerHTML = yearSelected;
}

function popUpCalendar(ctl, ctl2, format, check_in) {
  var leftpos = 0;
  var toppos = 0;

  calendarobj = dom ? document.getElementById("calendar") : ie ? document.all.calendar : document.calendar
  if (calendarobj) {
    calendarobj.onclick = function setbShow() {
      bShow = true;
    }
  }

  if (bPageLoaded) {
    if (crossobj.visibility == "hidden") {
      ctlToPlaceValue = ctl2;
      dateFormat = format;

      formatChar = " "
      aFormat = dateFormat.split(formatChar)
      if (aFormat.length < 3) {
        formatChar = "/";
        aFormat = dateFormat.split(formatChar);
        if (aFormat.length < 3) {
          formatChar = "."
          aFormat = dateFormat.split(formatChar)
          if (aFormat.length < 3) {
            formatChar = "-";
            aFormat = dateFormat.split(formatChar);
            if (aFormat.length < 3) {
               // invalid date format
               formatChar = "";
            }
          }
        }
      }
	  
	  var dateDayIdx, dateMonthIdx, dateYearIdx;

      tokensChanged = 0;
      if (formatChar != "") {
        // use user's date
        aData = ctl2.value.split(formatChar)

        for (i = 0; i < 3; i++) {
          if ((aFormat[i] == "d") || (aFormat[i] == "dd")) {
            dateSelected = parseInt(aData[i], 10);
            tokensChanged++;
			dateDayIdx = i;
          }
          else if ((aFormat[i] == "m") || (aFormat[i] == "mm")) {
            monthSelected = parseInt(aData[i], 10) - 1
            tokensChanged++
			dateMonthIdx = i;
          }
          else if (aFormat[i]=="yy") {
            yearSelected = parseInt(aData[i], 10)
            if (String(yearSelected).length < 4) yearSelected += 2000;
            tokensChanged++
			dateYearIdx = i;
          }
          else if (aFormat[i]=="yyyy") {
            yearSelected = parseInt(aData[i], 10)
            if (String(yearSelected).length < 4) yearSelected += 2000;
            tokensChanged++
			dateYearIdx = i;
          }
          else if (aFormat[i]=="mmm") {
            for (j = 0; j < 12; j++) {
              if (aData[i]==monthName[j]) {
                monthSelected = j;
                tokensChanged++;
				dateMonthIdx = i;
              }
            }
          }
        }
      }
	  
	  // check-in date considered to be in the same format as the original specified date
      if (check_in && check_in.value) {
        var value = check_in.value;
        var dateArray = new Array;
        var j;
        if (value.search('/') != -1) dateArray = value.split('/');
        if (value.search('-') != -1) dateArray = value.split('-');
        if (value.search('\\.') != -1) dateArray = value.split('\\.');
		
		var dateDay, dateMonth, dateYear;
		
		if (monthName && (value.search(' ') != -1)) {
			dateArray = value.split(' ');
		  	for (j = 0; j < 12; j++) {
		  		if (dateArray[dateMonthIdx] == monthName[j]) {
		  			dateArray[dateMonthIdx] = j + 1;
		  			break;
		  		}
		  	}
		}
        if (dateArray.length == 3 && dateArray[dateYearIdx].length == 2) {
          dateArray[dateYearIdx] = String(2000+Number(dateArray[dateYearIdx]));
        }
		
        checkInDate = new Date(dateArray[dateYearIdx], dateArray[dateMonthIdx]-1, dateArray[dateDayIdx], 0, 0, 0, 0);
        checkInDate = new Date(Number(checkInDate) + 24*60*60*1000);
      } else {
        checkInDate = false;
      }
	  
      if ((tokensChanged != 3) || isNaN(dateSelected) || isNaN(monthSelected) || isNaN(yearSelected)) {
        if (checkInDate) {
          dateSelected = checkInDate.getDate();
          monthSelected = checkInDate.getMonth();
          yearSelected = checkInDate.getYear();
          if (String(yearSelected).length < 4) yearSelected += 1900;
        } else {
          dateSelected = dateNow;
          monthSelected = monthNow;
          yearSelected = yearNow;
        }
      }

      odateSelected = dateSelected;
      omonthSelected = monthSelected;
      oyearSelected = yearSelected;

      aTag = ctl;
      do {
        aTag = aTag.offsetParent;
        if (!aTag) break;
        leftpos += aTag.offsetLeft;
        toppos += aTag.offsetTop;
      } while(aTag.tagName != "BODY");

      crossobj.left = fixedX == -1 ? (ctl.offsetLeft + leftpos)+'px' : fixedX;
      crossobj.top = fixedY == -1 ? (ctl.offsetTop + toppos + ctl.offsetHeight + 2)+'px' : fixedY;
      
      constructCalendar(1, monthSelected, yearSelected);
      crossobj.visibility = (dom||ie) ? "visible" : "show";
      
      hideCalElement('SELECT', document.getElementById("calendar"));
      hideCalElement('APPLET', document.getElementById("calendar"));                   

      bShow = true;
    }
  }
  else {
    DateSelectorInit();
    popUpCalendar(ctl, ctl2, format, check_in);
  }
}

function DateSelectorInit() {
  if (ns4) return;

//  if (!ie) { yearNow += 1900 }

  crossobj = dom ? document.getElementById("calendar").style : ie ? document.all.calendar : document.calendar
  hideCalendar();
  
  monthConstructed = false;
  yearConstructed = false;

  sHTML1 = "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
  sHTML1 += "<tr>\n";
  sHTML1 += "     <td width='5'><span id='spanLeft' class='title-control-normal-style' onclick='javascript:decMonth()'>&laquo;&nbsp;&nbsp;</span></td>\n";
  sHTML1 += "     <td width='100%' align='center'><span id='spanMonth' class='title-control-normal-style'></span>&nbsp;<span id='spanYear' class='title-control-normal-style'></span></td>\n";
  sHTML1 += "     <td width='5'><span id='spanRight' class='title-control-normal-style' onclick='incMonth()'>&nbsp;&nbsp;&raquo;</span></td>\n";
  sHTML1 += "</tr>\n";
  sHTML1 += "</table>\n";

  document.getElementById("calendar_caption").innerHTML  = sHTML1

  bPageLoaded=true
}

function DocumentRegisterEvents() {
  document.onkeypress = function hideCalender_Trap1(event) {
    if (event && event.keyCode == 27) hideCalendar()
  }

  document.onclick = function hideCalender_Trap2() {
    if (!bShow) hideCalendar();
    bShow = false;
  }
}
 
