/*
Mark's funky Calendar Control
*/

var calendarCount = 0;
var currentCal = false;
var currentCalInput = false;
var calculating = false;
var imgDirectory = '/assets/scripts/ferry_system/calendar/images/';
var currentDateA = false;
var calendarOffsetTop = 19;
var calendarOffsetLeft = -125;

function getMonthLen(theYear, theMonth) {
	var oneHour = 1000 * 60 * 60;
	var oneDay = oneHour * 24;
	var thisMonth = new Date(theYear, theMonth, 1);
	var nextMonth = new Date(theYear, theMonth + 1, 1);
	var len = Math.ceil((nextMonth.getTime() - thisMonth.getTime() - oneHour)/oneDay);
	return len;
}

function clearCalendars()
{
	for(var i=0;i<calendarCount;i++)
	{
		var div = document.getElementById('mobCalendar_'+i);
		try{		
			div.parentNode.removeChild(div);
		}catch(e){
		}
	}
}

function setDate(a,m,y,input){
	
	try{
		input.value = getDateString(a.firstChild.nodeValue,m,y);
		clearCalendars();
	}catch(e){
		alert(e);
	}
}

function drawCalendar(input,btn,noHide)
{
	
	if(currentCalInput==input && !noHide)
	{
		clearCalendars();
		currentCal = false;
		currentCalInput = false;
		return;
	}
	if(noHide)
	{
		clearCalendars();
	}
	
	
	
	
	currentCalInput = input;

	if(currentCal && currentCalInput!=input)
	{
		//currentCal.parentNode.removeChild(currentCal);
		currentCal = false;
		currentCalInput = input;
	}	
	
	var fDate;
	var days = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
	var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
	var inputName = input;
	var input = document.getElementById(inputName);
	var date = new Date();
	var calendarID = 'mobCalendar_'+(calendarCount++);
	
	if(input.value=='')
	{
		var day = date.getDate();
		var month = date.getMonth();
		var year = date.getYear();
		if(year<1000) year+=1900;
		input.value = getDateString(day,month+1,year);		
	}
	else
	{
		var dateExploded = input.value.split('/');
		var day = parseNumber(dateExploded[0]);
		var month = parseNumber(dateExploded[1])-1;
		var year = parseNumber(dateExploded[2]);
		if(year<1000) year+=1900;
	}
	var dayCounter = 0;
	
	
	
	
	
	var nMonth = new Date();
	nMonth.setDate(1);
	nMonth.setMonth(month);
	nMonth.setYear(year);	
	nMonth.setHours(12);
	var firstDay = nMonth.getDay();
	
	//alert(getDateString(1,month+1,year));
	//alert(firstDay);
	
	var lastDay = getMonthLen(year,month);
	
	var div = document.createElement('DIV');
	div.style.left = getAbsoluteLeft(btn)+calendarOffsetLeft;
	div.style.top = getAbsoluteTop(btn)+calendarOffsetTop;
	div.id = calendarID;
	div.className = 'calendar';
	
	
	var table = document.createElement('TABLE');
	table.className = 'header';
	var tbody = document.createElement('TBODY');
	var tr = document.createElement('TR');
	
	//Draw a prev month button
	var td = document.createElement('TD');
	td.style.width = '12px';
	td.style.textAlign = 'center';
	var a = document.createElement('A');
	a.onclick = function(){
		var m = month;
		var y = year;
		if(m>11){m = 11;}
		if(m<=0){m = 11;y--;}else{m = parseNumber(month)-1;}
		input.value = getDateString(day,m+1,y);
		drawCalendar(inputName,btn,true);
	}
	var img = document.createElement('IMG');
	img.src=imgDirectory+'down.gif';
	a.appendChild(img);
	td.appendChild(a);
	tr.appendChild(td);
	
	//Current month and year
	var td = document.createElement('TD');
	td.style.textAlign = 'center';
	var txt = document.createTextNode(months[month]+' '+year);
	td.appendChild(txt);
	tr.appendChild(td);	
	
	//Draw a next month button
	var td = document.createElement('TD');
	td.style.width = '12px';
	td.style.textAlign = 'center';
	var a = document.createElement('A');
	a.onclick = function(){
		var m = month;
		var y = year;
		if(m>11){m = 11;}
		if(m>=11){m = 1;y++}else{m =  parseNumber(month)+1;}
		input.value = getDateString(day,m+1,y);
		drawCalendar(inputName,btn,true);
	}
	var img = document.createElement('IMG');
	img.src=imgDirectory+'up.gif';
	a.appendChild(img);
	td.appendChild(a);
	tr.appendChild(td);
	
	tbody.appendChild(tr);
	table.appendChild(tbody);
	div.appendChild(table);
	
	
	
	var table = document.createElement('TABLE');
	table.className = 'days';
	var tbody = document.createElement('TBODY');
	//Days Headers
	var tr = document.createElement('TR');
	for(var col=0;col<7;col++)
	{
		var th = document.createElement('TH');
		var txt = document.createTextNode(days[col]);
		th.appendChild(txt);
		tr.appendChild(th);
	}
	tbody.appendChild(tr);
	//Days Values
	for(var r=0;r<6;r++)
	{
		if(dayCounter<=lastDay)
		{
			var tr = document.createElement('TR');
			for(var col=0;col<7;col++)
			{
				var td = document.createElement('TD');
				td.style.textAlign = 'right';
				if(firstDay>-1 && col==firstDay)
				{
					firstDay = -1;
					dayCounter++;
				}
				
				if(dayCounter>0 && dayCounter<=lastDay)
				{
					var a = document.createElement('A');
					a.href = 'javascript:void(0);';
										
					fDate = getDateString(dayCounter,month+1,year);
					if(fDate==input.value)
					{
						a.className = 'currentValue';
						currentDateA = a;
					}
					var txt = document.createTextNode(dayCounter);
					a.appendChild(txt);
					a = td.appendChild(a);
					a.onclick = function()
					{
						setDate(this,month+1,year,input);
					}
					dayCounter++;
				}
				else
				{
					var txt = document.createTextNode(' ');
					td.appendChild(txt);
				}
				tr.appendChild(td);
			}
			tbody.appendChild(tr);
		}
	}
	table.appendChild(tbody);
	div.appendChild(table);
	
	//alert(div.outerHTML);
	
	currentCal = input.parentNode.appendChild(div);		
}

function getDateString(d,m,y)
{
	var date = new Array(d,m,y);
	for(var i=0;i<date.length;i++)
	{
		var s = new String(date[i]);
		while(s.length<2)
		{
			s = '0'+s;
		}
		date[i] = s;
	}
	return date.join('/');
}

function getAbsoluteLeft(o) {
	
	oLeft = o.offsetLeft            // Get left position from the parent object
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
	oParent = o.offsetParent    // Get parent object reference
	oLeft += oParent.offsetLeft // Add parent left position
	o = oParent
	}
	// Return left postion
	return oLeft
}

function getAbsoluteTop(o) {
	// Get an object top position from the upper left viewport corner
	// Tested with relative and nested objects
	//o = document.getElementById(objectId)
	oTop = o.offsetTop            // Get top position from the parent object
	while(o.offsetParent!=null) { // Parse the parent hierarchy up to the document element
	oParent = o.offsetParent  // Get parent object reference
	oTop += oParent.offsetTop // Add parent top position
	o = oParent
	}
	// Return top position
	return oTop
}


function parseNumber(s) {
	return parseInt(parseFloat(s));
}

