/**
 * Book box javascript
 * @author: Lewis Vail
 * @version: 07/25/2011
 */
var bookBox = new function() {
	
	var lastSearchType;
	var maxoccupancy = 19;
	
	function popHiddenChild(e) {
		if(!e)
			e = window.event;
		var formObj;
		if(e.currentTarget)
			formObj = e.currentTarget.form;
		else
			formObj = e.srcElement.form;
			
		var noKids = formObj.noofkids.selectedIndex;
		for (var i=1; i<=noKids; i++) {
			if (i == 1)
				formObj.childAges.value = document.getElementsByName("jsr1_c" + i)[0].value;
			else
				formObj.childAges.value += "," + document.getElementsByName("jsr1_c" + i)[0].value;
		}
	}
	
	//Begin public functions
	return {
		 setCatOptions: function() {
		
			var townid = document.getElementById('CityCode').value;
			var zoneid = document.getElementById('ZoneCode').value;
			var catUrl = '/library/kb3ajax.php';
			catUrl += '?call=category&searchtype=' + lastSearchType + '&townid=' + townid + '&zoneid=' + zoneid;
			
			if (lastSearchType == "tickets") {
				setOptions('categoryId',catUrl);
			}
		},
		setSearchType: function() {
			
			var searchType;
			var radios = document.getElementsByName("searchtype");
			for (var i=0; i<radios.length; i++) {
				if (radios[i].checked==true)  {
					searchType = radios[i].id;
				}
			}
			if (searchType==lastSearchType)
				return;
			lastSearchType = searchType;
			var labels = document.getElementsByTagName("label");
			var checkinlabel, checkoutlabel;
			for (var i=0; i<labels.length; i++) {
				if (labels[i].htmlFor == searchType)
					labels[i].className = "searchtypeSel";
				else if (labels[i].className == "searchtypeSel")
					labels[i].className = "searchtype";
				else if (labels[i].htmlFor == "checkin")
					checkinlabel = labels[i];
				else if (labels[i].htmlFor == "checkout")
					checkoutlabel = labels[i];
			}
			
			// Set checkin and checkout labels
			switch (searchType) {
				case "accomodations":
					checkinlabel.innerHTML = "Check In";
					checkoutlabel.innerHTML = "Check Out";
					break;
				case "tickets":
					checkinlabel.innerHTML = "Arrival";
					checkoutlabel.innerHTML = "Departure";
					break;
				case "cars":
					checkinlabel.innerHTML = "Pick Up";
					checkoutlabel.innerHTML = "Drop Off";
					break;
			}
			// show and hide rows according to searchtype
			// guests
			var obj = document.getElementById("guests");
			if (searchType == "accomodations")
				obj.style.display = "block";
			else
				obj.style.display = "none";
			// activity category
			var obj = document.getElementById("actcat").parentNode;
			if (searchType == "tickets")
				obj.style.display = "block";
			else
				obj.style.display = "none";
			// Pickup/dropoff times
			var obj = document.getElementById("putime");
			if (searchType == "cars") {
				document.getElementById("putime").style.display = "block";
				document.getElementById("dotime").style.display = "block";
				checkoutlabel.parentNode.className = "inputwrapperL";
			}
			else {
				document.getElementById("putime").style.display = "none";
				document.getElementById("dotime").style.display = "none";
				checkoutlabel.parentNode.className = "inputwrapperR";
			}
			
		},
		updateGuestSel: function() {
			
			var adultSel = document.getElementsByName("noofadults")[0];
			var childSel = document.getElementsByName("noofkids")[0];
			var maxChildren = maxoccupancy-adultSel.options[adultSel.selectedIndex].value;
			for (j=childSel.length-1; j>=maxChildren+1; j--) {
				childSel.remove(j);
			}
			for (j=childSel.length; j<=maxChildren; j++) {
				var opt = document.createElement("option");
				opt.value = j;
				opt.text = j;
				try {
					childSel.add(opt,null);
				}
				catch(ex) {
					childSel.add(opt);
				}
			}
			var maxAdults = maxoccupancy-childSel.options[childSel.selectedIndex].value;
			for (j=adultSel.length-1; j>=maxAdults; j--) {
				adultSel.remove(j);
			}
			for (j=adultSel.length+1; j<=maxAdults; j++) {
				var opt = document.createElement("option");
				opt.value = j;
				opt.text = j;
				try {
					adultSel.add(opt,null);
				}
				catch(ex) {
					adultSel.add(opt);
				}
			}
		},
		
		childAges: function(obj) {
			// Get guestwrap
			var guestwrap = document.getElementById('guests');
			var numChildren = obj.selectedIndex + 2;
			// Get ageNodes
			var ageNodes = guestwrap.getElementsByTagName("div");
			// delete extra nodes
			if (ageNodes.length > numChildren) {
				for (var i=ageNodes.length-1; i>=numChildren; i--)
					guestwrap.removeChild(ageNodes[i]);
			}
			// add needed nodes
			if (ageNodes.length < numChildren) {
				for (var i=ageNodes.length; i<numChildren; i++) {
					var newAge = document.createElement("div");
					newAge.className = "inputwrapper";
					newAge.style.textAlign = "right";
					newAge.innerHTML = "Child " + (i-1) + " Age&nbsp;";
					// add input field for age
					var ageInput = document.createElement("input");
					ageInput.type = "text";
					ageInput.className = "searchinputn";
					ageInput.style.width = "auto";
					ageInput.size = "2";
					ageInput.name = "jsr1_c" + (i-1);
					if (document.addEventListener) {
						ageInput.addEventListener('blur',popHiddenChild, false);
						ageInput.addEventListener('change',popHiddenChild, false);
					}
					else {
						ageInput.attachEvent('onblur',popHiddenChild);
						ageInput.attachEvent('onchange',popHiddenChild);
					}
					newAge.appendChild(ageInput);
					guestwrap.appendChild(newAge);
				}
			}
		}
	};
};

/* author: Mike Gerrish*/
/* Creation date: 12/02/2004 */
function textCounter(field, countfield, maxlimit) {
if (field.value.length > maxlimit) field.value = field.value.substring(0, maxlimit);
else countfield.value = maxlimit - field.value.length;
}

function NewWindow(mypage, myname, w, h, scroll) {
	var winl = (screen.width - w) / 2;
	var wint = (screen.height - h) / 2;
	winprops = 'height='+h+',width='+w+',top='+wint+',left='+winl+',scrollbars='+scroll+',resizable'
	win = window.open(mypage, myname, winprops)
	if (parseInt(navigator.appVersion) >= 4) { win.window.focus(); }
}

function cancelEvent(e) {
	if (e.stopPropagation) {
		e.stopPropagation();
		e.preventDefault();
	}
	else {
		e.cancelBubble = true;
	}
}

/**
 * Search button mouseover/out functions
 * @author: Lewis Vail
 * @version: 12/17/2010
 */
function searchMouseOver(obj) {
	var children = obj.parentNode.parentNode.childNodes;
	for (var i=0; i<children.length; i++) {
		if (children[i].nodeName == "TD")
			children[i].className = children[i].className + "hover";
	}
}
function searchMouseOut(obj) {
	var children = obj.parentNode.parentNode.childNodes;
	for (var i=0; i<children.length; i++) {
		if (children[i].nodeName == "TD")
			children[i].className = children[i].className.replace("hover","");
	}
}

/**
 * setOptions
 * @description: Repopulates select option object with AJAX call
 * @author: Lewis Vail
 * @version: 01/12/2011
 */
function setOptions(obj,reqURL) {
	if (!obj.options)
		obj = document.getElementsByName(obj)[0];
	if (!obj.options)
		obj = document.getElementById(obj);
	if (!obj.options)
		return;
	
	var req;
	if (window.XMLHttpRequest)
		req = new XMLHttpRequest();
	else
		req = new ActiveXObject("Microsoft.XMLHTTP");
	
	req.onreadystatechange = function() {
		if (req.readyState==4 && req.status==200) {
			if (obj.selectedIndex>=0 && obj.selectedIndex<obj.options.length)
				var currentvalue = obj.options[obj.selectedIndex].value;
			while (obj.options.length>0)
				obj.remove(0);
			var responseStr = req.responseText;
			
			var i=0;
			while (responseStr.length > new String("</option>").length && i<100) {
				var newOption = document.createElement('option');
				responseStr = responseStr.replace('<option value="','');
				newOption.value = responseStr.slice(0,responseStr.indexOf('"'));
				responseStr = responseStr.slice(responseStr.indexOf('>')+1);
				newOption.text = responseStr.slice(0,responseStr.indexOf('<'));
				responseStr = responseStr.slice(responseStr.indexOf('>')+1);
				try {
					obj.add(newOption,null);
				  }
				catch(ex) {
					obj.add(newOption);
				}
			}
			for (var i=0; i<obj.options.length; i++) {
				if (obj.options[i].value==currentvalue)
					obj.selectedIndex=i;
			}
			i++;
		}
		//alert("readystate is " + req.readyState + "\nstatus is " + req.status);
	}
	
	req.open("GET",reqURL,true);
	req.send();
}

/**************************************************************/
/**
 * waiting message
 * @author: Lewis Vail
 * @version: 01/18/2011
 */
var waitDiv;
var waitInitialized = new Boolean();
var waitBg;
var waitMsgTD;
var wTable;

function initWait(loadImageStr) {
	//alert("wait initializing");
	// build wait div
	waitDiv = document.createElement("div");
	//waitDiv.style.width = "400px";
	//waitDiv.style.height = "120px";
	waitDiv.style.zIndex = "2";
	waitDiv.style.backgroundColor = "#FFFFFF";
	waitDiv.style.border = "1px solid #000000";
	waitDiv.style.MozBoxShadow = "5px 5px 5px #999999";
	waitDiv.style.WebkitBoxShadow = "5px 5px 5px #999999";
	waitDiv.style.boxShadow = "5px 5px 5px #999999";
	
	// build table
	wTable = document.createElement("table");
	wTable.cellPadding = "5";
	wTable.cellSpacing = "0";
	wTable.style.border = "none";
	//wTable.style.width = "290px";
	//wTable.style.height = "100%";
	//wTable.style.verticalAlign = "middle";
	waitDiv.appendChild(wTable);
	
	//build first row
	wTable.insertRow(0);
	
	// build first cell
	wTable.rows[0].insertCell(0);
	
	// Add load Image
	var loadImage = new Image();
	loadImage.src = loadImageStr;
	wTable.rows[0].cells[0].appendChild(loadImage);
	
	// build next cell
	wTable.rows[0].insertCell(1);
	waitMsgTD = wTable.rows[0].cells[1];
	
	waitInitialized = true;
}

function displayWait(message,container) {

	if (waitInitialized == false)
		initWait("");
	
	// set wait message
	waitMsgTD.innerHTML = message;
	//waitMsgTD.innerHTML = "Please wait while we check availability for<br><b>" + pageTitle + "</b>"
	
	// display div
	container.appendChild(waitDiv);
	waitDiv.style.width = wTable.scrollWidth + "px";
	waitDiv.style.position = "absolute";
	var top = (container.scrollHeight - parseInt(waitDiv.scrollHeight))/2;
	var left = (container.scrollWidth - parseInt(waitDiv.scrollWidth))/2;
	waitDiv.style.top = top + "px";
	waitDiv.style.left = left + "px";
}

function removeWait(container) {
	if (waitDiv)
		container.removeChild(waitDiv);
}
/**************************************************************/

/**
 * Javascript Calendar
 * @author: Lewis Vail
 * @version: 01/06/2012
 */
function JSCalendar() {

	// calendar variables
	//var currentMonth;
	var monthList = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	var calTable;
	var calDev;
	var calDays;
	var calToday;
	var yearSel;
	var monthSel;
	var checkinObj;
	var checkoutObj;
	var numNightsObj;
	var baseyear = 2009;
	var endyear = new Date().getFullYear()+2;
	var availability;
	var isShowing = new Boolean();
	var minDate;
	var maxDate;
	var onPrintCal;
	
	function printCalendar(year, month) {
		
		// set checkinObj, checkoutObj, and numNightsObj
		if (!checkinObj) {
			checkinObj = document.getElementsByName("checkindate")[0];
		}
		if (!checkoutObj)
			if (checkinObj && checkinObj.form.checkoutdate)
				checkoutObj = checkinObj.form.checkoutdate;
			else
				checkoutObj = document.getElementsByName("checkoutdate")[0];
		if (!numNightsObj)
			if (checkinObj && checkinObj.form.staynights)
				numNightsObj = checkinObj.form.staynights;
			else
				numNightsObj = document.getElementsByName("staynights")[0];
			
		var day;
		if (isFinite(year)) {
			day = new Date(year, month);
			//alert(day.toString());
		}
		else if (checkinObj.value) {
			day = new Date(Date.parse(checkinObj.value))
			if (day.toString() == "Invalid Date")
				day = new Date();
		}
		else
			day = new Date();
			
		//Set day date to be mid day
		day.setHours(12);
		
		// set checkin date
		var checkin;
		if (checkinObj) {
			if (checkinObj.form.checkindate) {
				if (!(checkinObj.form.checkindate.value))
					updateCheckIn((day.getMonth()+1) + "/" + day.getDate() + "/" + day.getFullYear());
				var dateString = document.getElementsByName("checkindate")[0].value;
				checkin = new Date(Date.parse(dateString));
			}
			else {
				if (!(checkinObj.value))
					updateCheckIn((day.getMonth()+1) + "/" + day.getDate() + "/" + day.getFullYear());
				var dateString = checkinObj.value;
				checkin = new Date(Date.parse(dateString));
			}
		}
		else {
			checkin = new Date(day.getTime());
		}
		
		// set checkout date
		var checkout;
		if (checkoutObj && numNightsObj) {
			dateString = checkoutObj.value;
			checkout = new Date(Date.parse(dateString));
		}
		else {
			checkout = new Date(checkin.getTime());
			checkout.setDate(checkout.getDate()+1);
		}
		
		// set Year
		var yearValid = new Boolean();
		for (var index=0; index < yearSel.length; index++){
			if (yearSel.options[index].value == day.getFullYear()) {
				yearSel.selectedIndex = index;
				// print Month
				monthSel.selectedIndex = day.getMonth();
				yearValid = true;
				break;
			}
		}
		
		if (yearValid != true) {
			day = new Date(yearSel.options[yearSel.selectedIndex].value, monthSel.selectedIndex);
		}
		
		// disable unavailable months
		if (maxDate || minDate) {
			monthSel.options[0].disabled = false;
			for (var i=1; i<monthSel.options.length; i++) {
				var tempday = new Date(yearSel.options[yearSel.selectedIndex].value, i);
				monthSel.options[i].disabled = false;
				if (maxDate) {
					if (tempday>maxDate)
						monthSel.options[i].disabled = true;
				}
				if (minDate) {
					tempday.setDate(tempday.getDate()-1);
					if (tempday<minDate)
						monthSel.options[i-1].disabled = true;
				}
			}
		}
		
		// print calendar
		day.setDate(1);
		while (day.getDay() > 0) {
			day.setDate(day.getDate()-1);
		}
		
		//set availIndex
		var availIndex = 0;
		if (!availability && document.getElementsByName("calavailability")[0])
			availability = document.getElementsByName("calavailability")[0].value;
		//alert(availability);
		var today = new Date();
		if (today < day) {
			//alert("today is less than the day chosen");
			while (today < day) {
				today.setDate(today.getDate()+1);
				availIndex++;
			}
		}
		else if (today > day) {
			//alert("today is greater than the day chosen");
			while ((today.getFullYear()!=day.getFullYear()) || (today.getMonth()!=day.getMonth()) || (today.getDate()!=day.getDate())) {
				//alert("today is " + today.toString() + "\nday is "+day.toString());
				today.setDate(today.getDate()-1);
				availIndex--;
			}
		}
		//alert("availIndex is " + availIndex);
		
		
		var cellclass = "jscalCellsExMonth";
		var numweeks = 6;
		for (var i=0; i < numweeks; i++) {
			//var rowObj = document.getElementById("week"+i);
			//alert("rowObj is " + rowObj.id);
			var numdays = 7;
			//var rowCells = "";
			for (var j=0; j < numdays; j++) {
				
				//adjust cellclass if necisary
				if (day.getDate() == 1) {
					if (cellclass == "jscalCellsExMonth")
						cellclass = "jscalCells";
					else
						cellclass = "jscalCellsExMonth";
				}
				// default class
				calDays[i][j].className = cellclass;
				//denote weekends
				if (j == 0 || j == numdays-1) {
					if (cellclass != "jscalCellsExMonth")
						calDays[i][j].className = "jscalCellsWeekend";
				}
				// denote selected days
				if (day < checkout && day >= checkin)
					calDays[i][j].className = "jscalInputDate";
					//rowCells += "<td class=\"selected\" ";
					
				// add ID used to denote what date was clicked
				calDays[i][j].id = (day.getMonth()+1) + "/" + day.getDate() + "/" + day.getFullYear();
				
				//denote unavailable days
				if (availability) {
					if (availIndex >= 0 && availIndex < availability.length) {
						if (availability.charAt(availIndex) == "0") {
							calDays[i][j].className += "Disabled";
						}
					}
				}
				if (minDate && minDate > day) {
					calDays[i][j].className += "Disabled";
				}
				if (maxDate && maxDate < day) {
					calDays[i][j].className += "Disabled";
				}
				calDays[i][j].innerHTML = day.getDate();
				day.setDate(day.getDate()+1);
				availIndex++;
			}
		}
		day = new Date();
		day.setHours(12);
		var todayStr = (day.getMonth()+1) + "/" + day.getDate() + "/" + day.getFullYear();
		calToday.innerHTML = "Today: " + todayStr;
		calToday.id = todayStr;
		
		if (onPrintCal) {
			onPrintCal();
			onPrintCal = null;
		}
	}
	
	function updateCheckIn(dateString) {
		
		if (new Date(Date.parse(dateString)).toString() == "Invalid Date" || !dateString)
			dateString = checkinObj.value;
		
		checkinObj.value = dateString;
			
		var checkoutDate = new Date(Date.parse(dateString));
			
		// handle two year date
		if (checkoutDate.getFullYear() <= new Date().getFullYear()-90) {
			checkoutDate.setFullYear(checkoutDate.getFullYear()+100);
		}
		checkinObj.value = "";
		if (checkoutDate.getMonth() < 9)
			checkinObj.value = "0";
		checkinObj.value += (checkoutDate.getMonth()+1);
		checkinObj.value += "/";
		if (checkoutDate.getDate() < 10)
			checkinObj.value += "0";
		checkinObj.value += checkoutDate.getDate();
		checkinObj.value += "/" + checkoutDate.getFullYear();
		
		//Handle change of checkout
		if (checkoutObj == checkinObj) {
			if (checkoutObj.form.checkindate) {
				checkinObj = checkoutObj.form.checkindate;
				var checkin = new Date(Date.parse(checkinObj.value));
				if (numNightsObj) {
					var maxnights = 365;
					if (numNightsObj.options)
						maxnights = numNightsObj.options.length;
					for (var i=0; i<maxnights; i++) {
						checkoutDate.setDate(checkoutDate.getDate()-1);
						if (numNightsObj.selectedIndex)
							numNightsObj.selectedIndex = i;
						else if (numNightsObj.value)
							numNightsObj.value = i+1;
						if (checkoutDate<=checkin) {
							checkoutDate = checkin;
							break;
						}
					}
				}
			}
		}
		else {
			// Handle case where checkout date should not be altered
			var checkinArr = document.getElementsByName("checkindate");
			var updateCheckout = new Boolean();
			for (var i=0; i<checkinArr.length; i++)
				if (checkinArr[i] == checkinObj) {
					updateCheckout = true;
					break;
				}
			if (updateCheckout!=true)
				return;
		}
		
		var numDays;
		if (numNightsObj)
			if (numNightsObj.options)
				numDays = parseInt(numNightsObj.options[numNightsObj.selectedIndex].value);

			else if (numNightsObj.value)
				numDays = parseInt(numNightsObj.value);
			else
				numDays = 1;
		else
			numDays = 1;
		
		checkoutDate.setDate(checkoutDate.getDate()+numDays);
		if (checkoutObj && numNightsObj) {
			checkoutObj.value = "";
			if (checkoutDate.getMonth() < 9)
				checkoutObj.value = "0";
			checkoutObj.value += (checkoutDate.getMonth()+1);
			checkoutObj.value += "/";
			if (checkoutDate.getDate() < 10)
				checkoutObj.value += "0";
			checkoutObj.value += checkoutDate.getDate();
			checkoutObj.value += "/" + checkoutDate.getFullYear();
		}
		
		dateString = checkinObj.value;
		var month = parseInt(dateString);
		dateString = dateString.substring(dateString.indexOf('/')+1);
		dateString = dateString.substring(dateString.indexOf('/')+1);
		var year = parseInt(dateString);
		
		printCalendar(year, month-1);
	}
	
	function build() {
		calTable = document.createElement("table");
		calTable.setAttribute("align", "center");
		calTable.className = "jscal";
		
		// build header elements
		var calTbody = document.createElement("tbody");
		var calTR = document.createElement("tr");
		var calTD = document.createElement("td");
		calTD.className = "jscalHead";
		monthSel = document.createElement("select");
		monthSel.className = "jscalHead";
		yearSel = document.createElement("select");
		for (var i=0; i < monthList.length; i++) {
			var option = document.createElement("option");
			option.value = monthList[i];
			option.innerHTML = monthList[i];
			//monthSel.options[i] = option;
			monthSel.options[i] = new Option(monthList[i],monthList[i]);
			/*try {
				monthSel.add(option,null);
			}
			catch(ex) {
				monthSel.add(option);
			}*/
		}
		yearSel.className = "jscalHead";
		for (var i=baseyear; i <= endyear; i++) {
			var option = document.createElement("option");
			option.value = i;
			option.innerHTML = i;
			//yearSel.options[i-baseyear] = option;
			yearSel.options[i-baseyear] = new Option(i,i);
			/*try {
				yearSel.add(option,null);
			}
			catch(ex) {
				yearSel.add(option);
			}*/
		}
		
		// add event listener month and year selects
		if (document.addEventListener) {
			monthSel.addEventListener('click', stopHide, true);
			monthSel.addEventListener('change', JSCal.redraw, false);
			yearSel.addEventListener('click', stopHide, true);
			yearSel.addEventListener('change', JSCal.redraw, false);
		}
		else {
			monthSel.attachEvent('onclick',stopHide);
			monthSel.attachEvent('onchange',JSCal.redraw);
			yearSel.attachEvent('onclick',stopHide);
			yearSel.attachEvent('onchange',JSCal.redraw);
		}
		
		// assemble header elements
		calTable.appendChild(calTbody);
		calTbody.appendChild(calTR);
		calTR.appendChild(calTD);
		calTD.appendChild(monthSel);
		calTD.appendChild(yearSel);
		
		// build calendar cell
		calTbody = document.createElement("tbody");
		calTR = document.createElement("tr");
		calTD = document.createElement("td");
		calTD.setAttribute("align", "center");
		calTable.appendChild(calTbody);
		calTbody.appendChild(calTR);
		calTR.appendChild(calTD);
		
		// build internal calendar table
		var inCalTable = document.createElement("table");
		inCalTable.className = "jscalCells";
		var inCalTbody = document.createElement("tbody");
		var inCalTR = document.createElement("tr");
		var inCalTD;
		calTD.appendChild(inCalTable);
		inCalTable.appendChild(inCalTbody);
		inCalTbody.appendChild(inCalTR);
		
		// Days of the week
		var daysOfWeek = new Array("S","M","T","W","T","F","S");
		for (var i=0; i<daysOfWeek.length; i++) {
			inCalTD = document.createElement("td");
			inCalTD.className = "jscalWeek";
			inCalTD.innerHTML = daysOfWeek[i];
			inCalTR.appendChild(inCalTD);
		}
		
		// calendar days
		calDays = new Array(6);
		for (var i=0; i<6; i++) {
			inCalTbody = document.createElement("tbody");
			inCalTable.appendChild(inCalTbody);
			inCalTR = document.createElement("tr");
			inCalTbody.appendChild(inCalTR);
			
			calDays[i] = new Array(7);
			for (var j=0; j<7; j++) {
				inCalTD = document.createElement("td");
				calDays[i][j] = inCalTD;
				inCalTR.appendChild(inCalTD);
				
				// add event listener to update the date after selection
				if (document.addEventListener) {
					calDays[i][j].addEventListener('click', JSCal.updateDates, false);
					//alert("event listener added");
				}
				else {
					calDays[i][j].attachEvent('onclick',JSCal.updateDates);
				}
			}
		}
		
		// build today cell
		inCalTbody = document.createElement("tbody");
		inCalTable.appendChild(inCalTbody);
		inCalTR = document.createElement("tr");
		inCalTbody.appendChild(inCalTR);
		calToday = document.createElement("td");
		calToday.setAttribute("colspan","7");
		inCalTR.appendChild(calToday);
		calToday.className = "jscalNow";
		// add event listener to update the date after selection
		if (document.addEventListener) {
			calToday.addEventListener('click', JSCal.updateDates, false);
			//alert("event listener added");
		}
		else {
			calToday.attachEvent('onclick',JSCal.updateDates);
		}
	}
	
	function stopHide(e) {
		if (e.stopPropagation) {
			e.stopPropagation();
			e.preventDefault();
		}
		else {
			e.cancelBubble = true;
		}
	}
	
	//Begin public functions
	return {
		show: function(ele) {
			
			//if (isShowing==true)
				//return;
			isShowing = true;

			// add event listener to stop hide on click
			if (ele.addEventListener)
				ele.addEventListener('click', stopHide, true);
			else
				ele.attachEvent('onclick',stopHide);
			
			if(!calTable)
				build();
			
			checkinObj = ele;
			
			printCalendar();
			calTable.style.position = "absolute";
			ele.parentNode.appendChild(calTable);
			var left = 0;
			var leftE = ele;
			while (leftE.offsetParent && leftE.offsetParent != calTable.offsetParent) {
				left += leftE.offsetLeft;
				leftE = leftE.offsetParent;
			}
			left += leftE.offsetLeft;
			calTable.style.left = left + "px";
			var winWidth;
			if (window.innerWidth)
				winWidth = innerWidth;
			else
				winWidth = document.documentElement.clientWidth;
			if ((calTable.scrollWidth+left)>winWidth) {
				left = (winWidth-calTable.scrollWidth)/2;
				calTable.style.left = left + "px";
			}
			calTable.style.zIndex = 1;
			
			// add event listener to hide table after selection
			if (document.addEventListener) {
				document.addEventListener('click',JSCal.hide, false);
			}
			else
				document.attachEvent('onclick',JSCal.hide);
		},
		redraw: function() {
			printCalendar(yearSel.options[yearSel.selectedIndex].value, monthSel.selectedIndex);
		},
		setMinDate: function(dateString) {
			var date = new Date(Date.parse(dateString));
			if (date.toString() != "Invalid Date") {
				minDate = date;
				baseyear = minDate.getFullYear();
			}
		},
		setMaxDate: function(dateString) {
			var date = new Date(Date.parse(dateString));
			if (date.toString() != "Invalid Date") {
				maxDate = date;
				endyear = maxDate.getFullYear();
			}
		},
		updateDates: function(e) {
			// get event
			if(!e)
				e = window.event;
			
			// if checkinObj has not been initialized
			if (!checkinObj) {
				if(document.getElementsByName("checkindate")[0]) {
					if(!calTable)
						build();
					printCalendar();
				}
				else
					return; // return if there is no checkin
			}
				
			// get event target
			var obj;
			if (e) {
				if (e.currentTarget)
					obj = e.currentTarget;
				else
					obj = e.srcElement;
				
				// Check to see if date is before min date
				if (minDate && obj) {
					if (minDate > new Date(Date.parse(obj.id))) {
						stopHide(e);
						return;
					}
				}
			}
			
			// Check to see if date is before maxdate
			if (maxDate && obj) {
				if (maxDate < new Date(Date.parse(obj.id))) {
					stopHide(e);
					return;
				}
			}
			
			//alert("obj type is " + obj.tagName);
			if(obj && obj.id)
				updateCheckIn(obj.id);
			else
				updateCheckIn();
		},
		hide: function() {
			calTable.parentNode.removeChild(calTable);
			// remove event listener to hide table after selection
			if (document.removeEventListener) {
				document.removeEventListener('click',JSCal.hide, false);
				checkinObj.removeEventListener('click', stopHide, true);
            }
			else {
				document.detachEvent('onclick',JSCal.hide);
				checkinObj.detachEvent('onclick',stopHide);
            }
				
			isShowing = false;
		},
		place: function() {
			
			// create unique id for div containing calendar
			var divId = "calDiv";
			for (var i=0; document.getElementById(divId); i++)
				divId = "calDiv"+i;
				
			document.write('<div id="'+divId+'"></div>');
			
			if (!calTable)
				build();
			
			// add event to populate calendar onLoad
			if (window.onload)
				onPrintCal = window.onload;
			if (window.addEventListener)
				window.addEventListener('load',printCalendar, false);
			else
				window.attachEvent('onload',printCalendar);
				
			document.getElementById(divId).appendChild(calTable);
		},
		onPlace: function(calback) {
			onPrintCal = function() {
				calback();
				onPrintCal = null;
			}
		},
		setBaseyear: function(year) {
			var date = new Date(year,0);
			if (date.toString() != "Invalid Date")
				baseyear = date.getFullYear();
		},
		setEndyear: function(year) {
			var date = new Date(year,0);
			if (date.toString() != "Invalid Date")
				endyear = date.getFullYear();
		}
	};
}
var JSCal = new JSCalendar();
