/**** Filename: calendar.js ******************************
***** Description: javascript for displaying calendar
*************************************************************/

var dayArrayShort = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
var dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
var dayArrayLong = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var monthArrayShort = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
var monthArrayLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

// these variables define the date formatting we're expecting and outputting.
// If you want to use a different format by default, change the defaultDateSeparator
// and defaultDateFormat variables either here or on your HTML page.
var defaultDateSeparator = "-";        // common values would be "/" or "."
var defaultDateFormat = "ymd"    // valid values are "mdy", "dmy", and "ymd"
var dateSeparator = defaultDateSeparator;
var dateFormat = defaultDateFormat;

var calendarObj = null
var validdays = null
var soldoutdays = null
var tcode = null
var calonly=true
var mode="TOUR"

function buildDate(datestring)
{
	var yr=datestring.substr(0,4)
	var mo=datestring.substr(5,2) - 1
	var day=datestring.substr(8,2)
	var nday=new Date()
	nday.setFullYear(yr,mo,day)
	return nday
}

function datetostring(yr,mo,day)
{
	y=String(yr)
	m=String(mo)
	d=String(day)
	if (m.length==1) m="0"+ m
	if (d.length==1) d="0"+ d
	return y + "-" + m + "-" + d
}

function divCal(calDivId, AnchorObject, dateFieldName,tourcode,calendaronly,cdate)
{
	var newnode=document.getElementById(calDivId)
	if (!newnode) {
		
		if (!AnchorObject)
			AnchorObject = document.getElementById(dateFieldName)

		var x = AnchorObject.offsetLeft;
		var y = AnchorObject.offsetTop + AnchorObject.offsetHeight ;

 		var parent = AnchorObject;
		while (parent.offsetParent) {
			parent = parent.offsetParent;
			x += parent.offsetLeft;
			y += parent.offsetTop ;
		}

		newNode = document.createElement("div");
		newNode.setAttribute("id", calDivId);
		newNode.setAttribute("class", "calDiv");
		newNode.setAttribute("style", "visibility: hidden;");
		document.body.appendChild(newNode);
	}
	displayCalendar(dateFieldName,null,tourcode,calendaronly,cdate,newNode,x,y)
}

function displayCalendar(dateFieldName,calField,tourcode,calendaronly,cdate,calDiv,x,y)
{
	var thisDay = new Date();
	tcode=tourcode
	if ((calendaronly=='HOTEL') || (calendaronly=='PEEK')) {
		mode=calendaronly
		calonly=false
	} else {
		calonly=calendaronly
	}
	validdays = null
	soldoutdays = null

	if (cdate) {
		thisDay=buildDate(cdate)
	} else {
		thisDay.setDate(1);
	}

	if (!calField) {
		if (!calDiv) {
			alert ("Error")
			return null
		}
		calDiv.style.position = "absolute";
		calDiv.style.left = x + "px";
		calDiv.style.top = y + "px";
		calDiv.style.visibility = (calDiv.style.visibility == "visible" ? "hidden" : "visible");
		calDiv.style.display = (calDiv.style.display == "block" ? "none" : "block");
		calDiv.style.zIndex = 10000;
	}

	if (calonly) {
		refreshCalendar(dateFieldName,calField,thisDay.getFullYear(),thisDay.getMonth(),thisDay.getDate(),calDiv)
	} else {
		var url="/secure/getValidDays.php?tourcode="+tcode+"&year="+thisDay.getFullYear()+"&month="+(thisDay.getMonth()+1)
//		var url="/secure/getValidDays.php?tourcode="+tcode
		if (mode=='HOTEL') {
			url="/secure/getValidDays.php?&mode=hotel&tourcode="+tcode+"&year="+thisDay.getFullYear()+"&month="+(thisDay.getMonth()+1)
		}

		calendarObj=GetXmlHttpObject()

		if (calendarObj==null) {
			tc.innerHTML="<H3>AJAX Connection failed</H3>"
			return null
		}
		calendarObj.onreadystatechange=function() {
			if (calendarObj.readyState==4 || calendarObj.readyState=="complete") {
				var vdays=calendarObj.responseText
				var darray=vdays.split("$")
				validdays=darray[0].split(",")
				soldoutdays=darray[1].split(",")

				refreshCalendar(dateFieldName,calField,thisDay.getFullYear(),thisDay.getMonth(),thisDay.getDate(),calDiv)
			}
		}

		calendarObj.open("GET",url,true)
		calendarObj.send(null)
	}
}

function matchdate(cdate, datearray)
{
	if (!datearray) return false

	for (var i=0; datearray[i] ; i++) {
		if (cdate == datearray[i]) return true
	}
	return false
}

function refreshCalendar(dateFieldName,targetcell,year,month,day,calDiv)
{
  if (targetcell) {
	  var tc=document.getElementById(targetcell)
	  if (!tc) {
	  	alert("Calendar: Couldn't find target cell: "+targetcell)
	  	return null
	  }
	  tc.style.visibility="visible"
	  tc.style.display="inline"
  } else {
  	if (!calDiv) {
	  	alert("Calendar: Couldn't find target DIV ")
	  	return null
	}
  	var tc=calDiv
  	targetcell=calDiv.id
  }
  // the calendar will be drawn as a table
  // you can customize the table elements with a global CSS style sheet,
  // or by hardcoding style and formatting elements below
//  tc.style.visibility="visible"
//  tc.style.display="block"


  var thisDay=new Date(year,month,1)

  var crlf = "\r\n";
  var TABLE = "<table cols=7 class='dpTable'>" + crlf;
  var xTABLE = "</table>" + crlf;
  var TR = "<tr class='dpTR'>";
  var TR_title = "<tr class='dpTitleTR'>";
  var TR_days = "<tr class='dpDayTR'>";
  var TR_todaybutton = "<tr class='dpTodayButtonTR'>";
  var xTR = "</tr>" + crlf;
  var TD = "<td class='dpTD' onMouseOut='this.className=\"dpTD\";' onMouseOver=' this.className=\"dpTDHover\";' "; // left open
  var TD_title = "<td colspan=5 class='dpTitleTD'>";
  var TD_buttons = "<td class='dpButtonTD'>";
  var TD_todaybutton = "<td colspan=7 class='dpTodayButtonTD'>";
  var TD_days = "<td class='dpDayTD'>";
  var TD_selected = "<td class='dpDayHighlightTD' onMouseOut='this.className=\"dpDayHighlightTD\";' onMouseOver='this.className=\"dpTDHover\";' ";    // leave this tag open
  var TD_soldout=" title='已售完' "

  var xTD = "</td>" + crlf;
  var DIV_title = "<div class='dpTitleText'>";
  var DIV_selected = "<div class='dpDayHighlight'>";
  var DIV_soldout = "<div class='dpDaySoldout'>";
  var DIV_valid = "<div class='dpDayValid'>";
  var xDIV = "</div>";

  // start generating the code for the calendar table
  var html = TABLE;

  // this is the title bar, which displays the month and the buttons to
  // go back to a previous month or forward to the next month
  html += TR_title;
  html += TD_buttons + getButtonCode(dateFieldName,targetcell,thisDay, -1, "&lt;") + xTD;
  html += TD_title + DIV_title + monthArrayLong[ thisDay.getMonth() ] + " " + thisDay.getFullYear() + xDIV + xTD;
  html += TD_buttons + getButtonCode(dateFieldName,targetcell,thisDay, 1, "&gt;") + xTD;
  html += xTR;

  // this is the row that indicates which day of the week we're on
  html += TR_days;
  for(i = 0; i < dayArrayShort.length; i++)
    html += TD_days + dayArrayShort[i] + xTD;
  html += xTR;

  // now we'll start populating the table with days of the month
  html += TR;

  // first, the leading blanks
  for (i = 0; i < thisDay.getDay(); i++)
    html += TD +">" + "&nbsp;" + xTD;

  // now, the days of the month
  var seldate=""
  if (mode != "PEEK") seldate=buildDate(document.getElementById(dateFieldName).value)

  var cday=new Date()
  cday.setTime(cday.getTime())

  do {
    dayNum = thisDay.getDate();
    TD_onclick = " onclick='updateDateField(\""+targetcell+"\", \"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>";
	if (mode=="PEEK") TD_onclick=">"

	if (calonly)
	  html += TD + TD_onclick + dayNum + xTD;
//	else if ( cday > thisDay )
//	  html += TD + ">" + dayNum + xTD;
    else if (thisDay.toString()==seldate.toString())
      html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;
    else if (matchdate(getDateString(thisDay), soldoutdays))
      html += TD + TD_soldout + ">" + DIV_soldout + dayNum + xDIV + xTD;
    else if (matchdate(getDateString(thisDay), validdays)) 
      html += TD + TD_onclick + DIV_valid + dayNum + xDIV + xTD;
	else
	  html += TD + ">" + dayNum + xTD;

    // if this is a Saturday, start a new row
    if (thisDay.getDay() == 6)
      html += xTR + TR;

    // increment the day
    thisDay.setDate(thisDay.getDate() + 1);
  } while (thisDay.getDate() > 1)

  // fill in any trailing blanks
  if (thisDay.getDay() > 0) {
    for (i = 6; i > thisDay.getDay(); i--)
      html += TD +">" + "&nbsp;" + xTD;
  }
  html += xTR;

  // add a button to allow the user to easily return to today, or close the calendar
  var todayString = "Today is " + dayArrayMed[cday.getDay()] + ", " + monthArrayMed[ cday.getMonth()] + " " + cday.getDate();
  html += TR_todaybutton + TD_todaybutton;

  html += "<button class='dpTodayButton' type='button' onClick='displayCalendar(\"" + dateFieldName + "\",\""+targetcell+"\" , "+tcode+","+calonly+",\""+ datetostring(cday.getFullYear(),cday.getMonth()+1,cday.getDate())+"\",null,0,0);'>This Month (本月)</button> ";
  html += "<button class='dpTodayButton' type='button' onClick='clearfield(\""+targetcell+"\")'>Close (关闭)</button>";
  html += xTD + xTR;

  // and finally, close the table
  html += xTABLE;

  if (tc.tagName=="DIV") {
  	ndiv=document.createElement("div")
  	ndiv.innerHTML=html
  	var tcc=tc.childNodes
  	while (tcc.length)
	  	tc.removeChild(tcc[0])
  	tc.appendChild(ndiv)
  } else {
	tc.innerHTML = html;
  }
}


/**
Convenience function for writing the code for the buttons that bring us back or forward
a month.
*/
function getButtonCode(dateFieldName, targetcell,dateVal, adjust, label)
{
  var newMonth = dateVal.getMonth () + 1 + adjust
  var newYear = dateVal.getFullYear()
  if (newMonth>12) {
  	newMonth=1
  	newYear+=1
  } else if (newMonth < 0) {
    newMonth == 12;
    newYear += -1;
  }
//  var newDate=new Date(newYear,newMonth,1)

  return "<button type='button' class='dpButton' onClick='displayCalendar(\"" + dateFieldName + "\",\""+targetcell+"\"," + tcode + "," +calonly + ",\"" + datetostring(newYear, newMonth, 1)+ " \",null,0,0);'>" + label + "</button>";
}


/**
Convert a JavaScript Date object to a string, based on the dateFormat and dateSeparator
variables at the beginning of this script library.
*/
function getDateString(dateVal)
{
  var dayString = "00" + dateVal.getDate();
  var monthString = "00" + (dateVal.getMonth()+1);
  dayString = dayString.substring(dayString.length - 2);
  monthString = monthString.substring(monthString.length - 2);

  switch (dateFormat) {
    case "dmy" :
      return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
    case "mdy" :
    default :
      return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
  }
}


/**
Convert a string to a JavaScript Date object.
*/
function getFieldDate(dateString)
{
  var dateVal;
  var dArray;
  var d, m, y;

  try {
    dArray = splitDateString(dateString);
    if (dArray) {
      switch (dateFormat) {
        case "dmy" :
          d = parseInt(dArray[0], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
        case "ymd" :
          d = parseInt(dArray[2], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[0], 10);
          break;
        case "mdy" :
        default :
          d = parseInt(dArray[1], 10);
          m = parseInt(dArray[0], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
      }
      dateVal = new Date(y, m, d);
    } else if (dateString) {
      dateVal = new Date(dateString);
    } else {
      dateVal = new Date();
    }
  } catch(e) {
    dateVal = new Date();
  }

  return dateVal;
}


/**
Try to split a date string into an array of elements, using common date separators.
If the date is split, an array is returned; otherwise, we just return false.
*/
function splitDateString(dateString)
{
  var dArray;
  if (dateString.indexOf("/") >= 0)
    dArray = dateString.split("/");
  else if (dateString.indexOf(".") >= 0)
    dArray = dateString.split(".");
  else if (dateString.indexOf("-") >= 0)
    dArray = dateString.split("-");
  else if (dateString.indexOf("\\") >= 0)
    dArray = dateString.split("\\");
  else
    dArray = false;

  return dArray;
}

function updateDateField(calcell, dateFieldName, dateString)
{
  var targetDateField = document.getElementById(dateFieldName);
  if (dateString)
    targetDateField.value = dateString;
  clearfield(calcell)
  targetDateField.focus();
}

function clearfield(calcell)
{
	var tcell=document.getElementById(calcell)

	if (tcell.tagName=="DIV") {
/*
		tcell.style.display="none"
		tcell.style.visibility="hidden"
		var tcc=tcell.childNodes
	 	while (tcc.length)
	  		tcell.removeChild(tcc[0])
	  	tcell.innerHTML=""
*/
		tcell.parentNode.removeChild(tcell)
	} else {
		tcell.innerHTML=""
	}
}
