/** 
 *  Calendar behavior is defined here. We add mouseover and mouseout events to
 *  every TD tag to get a rollover effect. We set a starting  anchor point on 
 *  every other click; and an ending anchor on alternate clicks.
 */
 
CalendarSelection = function () 
{
	this.rTds = [];
	this.rTdsSelected = [];
	this.dStartAnchor = null;
	this.dEndAnchor = null;
	this.init();
	this.isHighlighting = false;
}

CalendarSelection.prototype.addTd = function (el)
{
	this.rTds.push(el);
}

CalendarSelection.prototype.init = function () 
{
}

// either start the selection all over, or wrap it up
CalendarSelection.prototype.elWasClicked = function (el) 
{
	var el = el;
	// if we're starting a new selection, or
	// if they clicked BEFORE the start date, make this click the start date
	if (null != this.dEndAnchor || null == this.dStartAnchor ||
	    getDateFromElement(el) < getDateFromElement(this.dStartAnchor)
	   )
	{
		this.dStartAnchor = el;
		this.dEndAnchor = null;
		this.clearSelection();
		var oDate = getDateFromElement(el)
		setArrivalDate(oDate);
		this.isHighlighting = true;
		
	} else {
		this.dEndAnchor = el;
		setDepartureDate(getDateFromElement(el));
		this.setSelection();
		this.isHighlighting = false;
	}
}

CalendarSelection.prototype.setSelection = function (el)
{
	// step from start to end, 
	// adding TD elements as we go, 
	// lighting them up as we go
	var elEnd = el || this.dEndAnchor;
	if (!elEnd)
	{
		return false;
	}
	var bLightCell = false;
	for(var i = 0; i < this.rTds.length; i++)
	{
		if (this.rTds[i] === this.dStartAnchor)
		{
			bLightCell = true;
		}
		if (bLightCell)
		{
			this.rTdsSelected.push(this.rTds[i]);
			this.rTds[i].className = [this.rTds[i].className, "tdSel"].join(" ");
		}
		if (this.rTds[i] === elEnd)
		{
			bLightCell = false;
			break
		}		
	}
}

CalendarSelection.prototype.clearSelection = function ()
{
	// good thing we have that array. Loop over them, removing the sel style
	var sClassName = "";
	for (i = 0; i < this.rTdsSelected.length; i++)
	{
		sClassName = this.rTdsSelected[i].className;
		sClassName = sClassName.replace(/\s*tdSel\s*/g, "");
		this.rTdsSelected[i].className = sClassName;
	}
}

function tdWasClicked ()
{
	CalendarSelection.elWasClicked(this);
}

function setArrivalDate (oDate)
{
	var rMDY = [];
	rMDY[0] = "date_arrive_month";
	rMDY[1] = "date_arrive_day"
	rMDY[2] = "date_arrive_year"
	return _setDateDropdowns(rMDY, oDate);
}

function setDepartureDate (oDate)
{
	var rMDY = [];
	rMDY[0] = "date_depart_month";
	rMDY[1] = "date_depart_day"
	rMDY[2] = "date_depart_year"
	return _setDateDropdowns (rMDY, oDate);	
}

function _setDateDropdowns (rMDY, oDate)
{
	var now = new Date();
	
	var dMonth = document.getElementById(rMDY[0]);
	var dDate = document.getElementById(rMDY[1]);
	var dYear = document.getElementById(rMDY[2]);
	
	var iMonth = oDate.getMonth() + 1;
	var iDate = oDate.getDate();
	var iYear = oDate.getFullYear();
	var idxYear = iYear - now.getFullYear();

	dMonth.options[(iMonth-1)].selected = true;
	dDate.options[(iDate-1)].selected = true;
	dYear.options[idxYear].selected = true;
	
	return true;
}

var CalendarSelection = new CalendarSelection();

function getDateFromElement (el)
{
	
	var Y = 0;
	var M = 0;
	var D = el.innerHTML;
	
	// table ID will be cal-YYYY-MM
	dTable = _getTableParent(el);	

	if (dTable && dTable.id && /cal\-\d{4}\-\d{2}/.test(dTable.id))
	{
		Y = dTable.id.substr(4,4);
		M = dTable.id.substr(9,2);
		M = parseInt(M, 10);	// must include base 10 or "08", "09" fail
		M = M - 1;
	}
	return new Date(Y,M,D);
}

function _getTableParent (el)
{
	var dAncestor = el;
	while (dAncestor.parentNode && dAncestor.parentNode.tagName.toLowerCase() != "table")
	{
		dAncestor = dAncestor.parentNode;
	}
	dAncestor = dAncestor.parentNode;
	return dAncestor;
}
 
function lightTd () {
	var sClassName = this.className;
	if (!(/\btdLit\b/.test(sClassName)))
	{
		sClassName = [sClassName, "tdLit"].join(" ");
		this.className = sClassName;
		if (CalendarSelection.isHighlighting)
		{
			CalendarSelection.setSelection(this);
		}
	}
}

function unlightTd () {
	var sClassName = this.className;
	if (/\btdLit\b/.test(sClassName))
	{
		sClassName = sClassName.replace(/\s*tdLit\s*/g, "");
	}
	this.className = sClassName;
	if (CalendarSelection.isHighlighting)
	{
		CalendarSelection.clearSelection();
	}
}

function addTdEvents ()
{
	if (document.getElementById && document.createTextNode)
	{
		var div = document.getElementById("scrollingCalendar");
		if (div)
		{
			var tds = div.getElementsByTagName ('td');
			for (i=0; i<tds.length; i++)
			{
				tds[i].onmouseover = lightTd;
				tds[i].onmouseout = unlightTd;
				tds[i].onclick = tdWasClicked;
				CalendarSelection.addTd (tds[i]);
			}
		}
	}
}

addLoadEvent(addTdEvents);
