/********************************************************
 * calendar.js
 * March.14.2006
 ********************************************************
 * This calendar is developed by Sarfraz Qasim.
 * This script is totally free to use for any purpose.
 * For report bug Please mail at sarfraz.qasim@gmail.com.
 ********************************************************/


//***** Function Initializing Calendar Control *****
//***** Taking Arguments
//***** 1. Input box id in which date will be shown.
//***** 2. Div in which Calandar will be gerate.
//***** 3. Year from which calender will be start.
//***** 4. Month from which calender will be start.


function showDateFormate(year, month, day)
{
	completeyear = year.toString();
	year = completeyear.substring(2,4);
	completeMonthName = this.getCalendarMonth(month).toString();
	monthName = completeMonthName.substring(0,3);
	month = (++month) < 10 ? '0' + month : month;
	day = day < 10 ? '0' + day : day;
	
	//dateString = day +"/"+ month +"/"+ year;
	//dateString = day +"/"+ month +"/"+ completeyear;
	dateString = completeyear +"-"+ month +"-"+ day;
	
	return dateString;
}

function initializeCalendar(inputId, divId, e, year, month)
{
	var today = new Date();		//creating a current DATE object

	if(year != undefined)
	{
		today.setYear(year); 	//set the Year value of date object
		today.setMonth(month);	//set the Month value of date object
	}

	this.createCalendar(inputId, divId, today, e);
}

function initializeCalendarUpdate(inputId, divId, e, year, month,type)
{
	/*if(type == 'update')
	{
		alert('Start date cannot be changed');
		return;
	}*/
	var today = new Date();		//creating a current DATE object

	if(year != undefined && year !='')
	{
		today.setYear(year); 	//set the Year value of date object
		today.setMonth(month);	//set the Month value of date object
	}

	this.createCalendar(inputId, divId, today, e);
}
/*function initializeCalendarUpdate(inputId, divId, e, year, month,type)
{
	if(type == 'update')
	{
		alert('Start date cannot be changed');
		return;
	}
	var today = new Date();		//creating a current DATE object

	if(year != undefined && year !='')
	{
		today.setYear(year); 	//set the Year value of date object
		today.setMonth(month);	//set the Month value of date object
	}

	this.createCalendar(inputId, divId, today, e);
}

*/

//***** Function Generating Calendar HTML *****

function createCalendar(inputId, divId, today, e)
{
//	var today = new Date();		//creating a current DATE object
	year = today.getYear();		//current year
	month = today.getMonth();	//current month
	date = today.getDate();		//current date


	// Set browser specific year's value
	if(navigator.appName == "Microsoft Internet Explorer")
	{
		if(year < 2000) year += 1900;
	}

	else
	{
		 year += 1900;
	}



	//Function call, returns week day's array
	arrayDay = this.getWeekDays();
	weekDays = arrayDay.length;	//Number of Days in a week


	calendarLayout = "";	//string variable for storing calendar layout

	calendarLayout += "<input type='hidden' id='hdnYear"+divId+"' value='"+year+"'>";
	calendarLayout += "<input type='hidden' id='hdnMonth"+divId+"' value='"+month+"'>";
	
	calendarLayout += "<table cellspacing='1' cellpadding='0' border='0' class='calendarTable' onMouseDown=\"moveDivAbove('"+divId+"')\">";

	calendarLayout += this.getTitleRow(divId, weekDays);
	calendarLayout += this.getYearRow(inputId, divId, year, month, weekDays);
	calendarLayout += this.getMonthRow(inputId, divId, year, month, weekDays);
	calendarLayout += this.getCalendarRows(divId, inputId, 'hdnYear'+divId, 'hdnMonth'+divId, arrayDay, weekDays);

	calendarLayout += "</table>";


	objDiv = document.getElementById(divId);
	if (e != '')
	{
		objDiv.style.left = e.clientX + document.body.scrollLeft;
		objDiv.style.top = e.clientY + document.body.scrollTop-50;	
	}
	objDiv.innerHTML = calendarLayout;
	objDiv.style.display = 'inline';


	// Calling Div's drag function
	objCurDiv = document.all ? document.all[divId] : document.getElementById(divId);
	Drag.init(objCurDiv);	
	
}



//***** Function Generating Array of name of the WEEK for Header *****

function getWeekDays()
{
	arrayDay = new Array();

	arrayDay[0] = 'Su';
	arrayDay[1] = 'Mo';
	arrayDay[2] = 'Tu';
	arrayDay[3] = 'We';
	arrayDay[4] = 'Th';
	arrayDay[5] = 'Fr';
	arrayDay[6] = 'Sa';

	return arrayDay;
}


//***** Function Generating Array of name of the MONTHS for Header *****

function getCalendarMonth(month)
{
	arrayMonth = new Array();

	arrayMonth[0]  = 'January';
	arrayMonth[1]  = 'February';
	arrayMonth[2]  = 'March';
	arrayMonth[3]  = 'April';
	arrayMonth[4]  = 'May';
	arrayMonth[5]  = 'June';
	arrayMonth[6]  = 'July';
	arrayMonth[7]  = 'August';
	arrayMonth[8]  = 'September';
	arrayMonth[9]  = 'October';
	arrayMonth[10] = 'November';
	arrayMonth[11] = 'December';

	return arrayMonth[month];
}


//***** Function Generating Array of name of the MONTHS for Header *****

function getMonthNumber(monthName)
{
	arrayMonth = new Array();

	arrayMonth['Jan'] = '0';
	arrayMonth['Feb'] = '1';
	arrayMonth['Mar'] = '2';
	arrayMonth['Apr'] = '3';
	arrayMonth['May'] = '4';
	arrayMonth['Jun'] = '5';
	arrayMonth['Jul'] = '6';
	arrayMonth['Aug'] = '7';
	arrayMonth['Sep'] = '8';
	arrayMonth['Oct'] = '9';
	arrayMonth['Nov'] = '10';
	arrayMonth['Dec'] = '11';

	return arrayMonth[monthName];
}


//***** Function Generating Array of numbers of the DAYS in Month *****

function getDaysCountOfMonth(month, year)
{
	arrayDaysCount = new Array();

	arrayDaysCount[0]  = 31;
	arrayDaysCount[1]  = this.isLeapYear(year) ? 29 : 28;
	arrayDaysCount[2]  = 31;
	arrayDaysCount[3]  = 30;
	arrayDaysCount[4]  = 31;
	arrayDaysCount[5]  = 30;
	arrayDaysCount[6]  = 31;
	arrayDaysCount[7]  = 31;
	arrayDaysCount[8]  = 30;
	arrayDaysCount[9]  = 31;
	arrayDaysCount[10] = 30;
	arrayDaysCount[11] = 31;

	return arrayDaysCount[month];
}



//***** Function examines that the give Year is Leap year or not *****

function isLeapYear(year)
{
	(year % 4) == 0 ? returnValue = true : returnValue = false;
	return returnValue;
}


//***** Function close the Calendar Div *****

function closeCalendar(divId)
{
	objDiv = document.getElementById(divId);
	objDiv.innerHTML = '';
	objDiv.style.display = 'none';
}


//***** Function move the selected Calendar Div above *****

counterIndex = 1;
function moveDivAbove(divId)
{
	objDiv = document.getElementById(divId);
	objDiv.style.zIndex = ++counterIndex;
}


//***** Function show given message to status bar *****

function showStatus(msg)
{
	window.status = msg;
}


//***** Function retur initialize calendar's function syntax *****

function returnInitialization(inputId, divId, year, month)
{
	initializer = "javascript:initializeCalendar('"+inputId+"', '"+divId+"', '', '"+year+"', '"+month+"');";
	return initializer;
}


//***** Function return Calendar's Title Row *****

function getTitleRow(divId, weekDays)
{
	rowLayout = '';

	rowLayout += "<tr>";
	rowLayout += "<td align='center' valign='middle' colspan='"+weekDays+"' style='cursor:move'>";

	rowLayout += "<table cellspacing='0' cellpadding='2' border='0' width='100%'>";
	rowLayout += "<tr>";
	rowLayout += "<td align='left' valign='middle' class='titleRow'>";
	rowLayout += "Calendar :.</td>";
	rowLayout += "<td align='center' valign='middle' width='15' class='titleRow'>";
	rowLayout += "<a href='javascript:void(0)' onClick=\"javascript:closeCalendar('"+divId+"')\" title='Close Calendar' class='linksCalendar'>X</a></td>";
	rowLayout += "</tr>";
	rowLayout += "</table>";
	
	rowLayout += "</td>";
	rowLayout += "</tr>";

	return rowLayout;
}


//***** Function return Calendar's Year Row *****

function getYearRow(inputId, divId, year, month, weekDays)
{
	year = parseInt(year);
	previousYear = year - 1;	//previous year
	nextYear = year + 1;		//next year

	previousYearStr = this.returnInitialization(inputId, divId, previousYear, month);
	nextYearStr = this.returnInitialization(inputId, divId, nextYear, month);

	this.returnInitialization(inputId, divId, year, month);

	rowLayout = '';

	rowLayout += "<tr>";
	rowLayout += "<td align='center' valign='middle' colspan='"+weekDays+"' class='yearHeadingRow'>";

	rowLayout += "<table cellspacing='0' cellpadding='0' border='0' width='100%' class='yearHeadingRow'>";
	rowLayout += "<tr>";
	rowLayout += "<td align='center' valign='middle' width='15'>";
	rowLayout += '<a href="javascript:void(0)" onClick="'+previousYearStr+'"';
	rowLayout += " title='Previous Year "+previousYear+"' class='linksCalendar'>«</a></td>";
	rowLayout += "<td align='center' valign='middle'>";
	rowLayout += "Year " + year;
	rowLayout += "</td>";
	rowLayout += "<td align='left' valign='middle' width='12'>";
	rowLayout += "<a href='javascript:void(0)' onClick=\"javascript:showYears('"+inputId+"', '"+divId+"', '"+year+"', '"+month+"')\" title='Select Year' class='linksCalendar' style='font-size:12px; font-weight:bold'>+</a></td>";
	rowLayout += "<td align='center' valign='middle' width='15'>";
	rowLayout += '<a href="javascript:void(0)" onClick="'+nextYearStr+'"';
	rowLayout += " title='Next Year "+nextYear+"' class='linksCalendar'>»</a></td>";
	rowLayout += "</tr>";
	rowLayout += "</table>";

	rowLayout += "</td>";
	rowLayout += "</tr>";

	return rowLayout;
}


//***** Function return Calendar's Month Row *****

function getMonthRow(inputId, divId, year, month, weekDays)
{
	//Function call, returns Current Month in string format
	currentMonth = this.getCalendarMonth(month);

	month = parseInt(month);
	previousMonth = this.getCalendarMonth(month - 1);	//previous month
	nextMonth = this.getCalendarMonth(month + 1);		//next month

	previousMonthStr = this.returnInitialization(inputId, divId, year, (month - 1));
	nextMonthStr = this.returnInitialization(inputId, divId, year, (month + 1));


	rowLayout = '';

	rowLayout += "<tr>";
	rowLayout += "<td align='center' valign='middle' colspan='"+weekDays+"' class='monthHeadingRow'>";

	rowLayout += "<table cellspacing='0' cellpadding='1' border='0' width='100%'>";
	rowLayout += "<tr class='monthHeadingRow'>";
	rowLayout += "<td align='center' valign='middle' width='15'>";

	if(previousMonth == undefined)
	{
		previousMonth = this.getCalendarMonth(11);
	}
	rowLayout += '<a href="javascript:void(0)" onClick="'+previousMonthStr+'"';
	rowLayout += " title='Previous Month "+previousMonth+"' class='linksCalendar'>«</a>";

	rowLayout += "</td>";
	rowLayout += "<td align='center' valign='middle'>";
	rowLayout += currentMonth;
	rowLayout += "</td>";
	rowLayout += "<td align='center' valign='middle' width='5'>";
	rowLayout += "<a href='javascript:void(0)' onClick=\"javascript:showAllMonths('"+inputId+"', '"+divId+"', '"+year+"', '"+month+"')\" title='Select Month' class='linksCalendar' style='font-size:12px; font-weight:bold'>+</a></td>";
	rowLayout += "<td align='center' valign='middle' width='15'>";

	if(nextMonth == undefined)
	{
		nextMonth = this.getCalendarMonth(0);
	}
	rowLayout += '<a href="javascript:void(0)" onClick="'+nextMonthStr+'"';
	rowLayout += " title='Next Month "+nextMonth+"' class='linksCalendar'>»</a>";

	rowLayout += "</td>";
	rowLayout += "</tr>";
	rowLayout += "</table>";

	rowLayout += "</td>";
	rowLayout += "</tr>";

	return rowLayout;
}


//***** Function return Calendar Rows *****

function getCalendarRows(divId, inputId, hdnYeardivId, hdnMonthdivId, arrayDay, weekDays)
{
	rowLayout = '';

	rowLayout += "<tr>";

	//loop for generate week headings
	for(counter = 0; counter < weekDays; counter++)
	{
		rowLayout += "<td align='center' valign='middle' class='daysHeadingCell'>";
		rowLayout += arrayDay[counter] + "</td>";
	}

	rowLayout += "</tr>";


	tmpDate = new Date();				//creating a temporary DATE object
	tmpDate.setYear(year);				//setting temporary DATE Year value
	tmpDate.setMonth(month);			//setting temporary DATE Month value
	tmpDate.setDate(1);				//sets temporary DATE object date to 1
	firstDayOfCurrentMonth = tmpDate.getDay();	//gets the first day of the current month
	numberOfDaysInMonth = this.getDaysCountOfMonth(month, year);
	daysLoopCounter = Math.ceil((firstDayOfCurrentMonth + numberOfDaysInMonth) / weekDays);

	cellCounter = 0;
	dateCounter = 0;
	calendarDay = 0;

	//loop for generate week headings
	for(counter = 0; counter < daysLoopCounter; counter++)
	{
		rowLayout += "<tr>";
		for(count = 0; count < weekDays; count++)
		{
			if(cellCounter < firstDayOfCurrentMonth || dateCounter >= numberOfDaysInMonth)
			{
				rowLayout += "<td align='center' valign='middle' class='blankCell'>";
				rowLayout += "&nbsp;</td>";
			}

			else
			{
				dateCounter++;
				calendarDay = dateCounter;

				if(dateCounter == date) //for Current Date
				{
					rowLayout += "<td align='center' valign='middle' class='todayDateCell'>";
					rowLayout += "<input name='"+dateCounter+"' value='"+dateCounter+"' class='todayDateCell' onMouseOver=this.className='dateOver' onMouseOut=this.className='todayDateCell'";
				}

				else if(count == 0)	//for Sundays
				{
					rowLayout += "<td align='center' valign='middle' class='sundayDateCell'>";
					rowLayout += "<input name='"+dateCounter+"' value='"+dateCounter+"' class='sundayDateCell' onMouseOver=this.className='dateOver' onMouseOut=this.className='sundayDateCell'";
				}

				else
				{
					rowLayout += "<td align='center' valign='middle' class='normalDateCell'>";
					rowLayout += "<input name='"+dateCounter+"' value='"+dateCounter+"' class='normalDateCell' onMouseOver=this.className='dateOver' onMouseOut=this.className='normalDateCell'";
				}

				rowLayout += " onClick=\"dateFormate('"+divId+"', '"+inputId+"', '"+hdnYeardivId+"', '"+hdnMonthdivId+"', this.value)\" readonly></td>";

			}

			cellCounter++;
		}
		rowLayout += "</tr>";
	}

	return rowLayout;
}


//***** Function shows Calendar's Months *****

function showAllMonths(inputId, divId, year, month)
{
	weekDays = 3;
	rowCounter = 0;

	calendarLayout = "";	//string variable for storing calendar layout

	calendarLayout += "<table cellspacing='1' cellpadding='0' border='0' width='148' class='calendarTable' onMouseDown=\"moveDivAbove('"+divId+"')\">";

	calendarLayout += this.getTitleRow(divId, weekDays);
	calendarLayout += this.getYearRow(inputId, divId, year, month, weekDays);
	calendarLayout += this.getMonthRow(inputId, divId, year, month, weekDays);

	for(counter = 0; counter < 12; counter++)
	{
		if(rowCounter % weekDays == 0) calendarLayout += "<tr>";

		calendarLayout += "<td align='center' valign='middle' width='"+Math.floor((12 / weekDays) * 100)+"' class='monthCell'>";
		calendarLayout += "<input name='month' value='"+getCalendarMonth(counter).substring(0,3)+"' class='monthCell' onMouseOver=\"this.className='monthOver'\" onMouseOut=\"this.className='monthCell'\" onClick=\"selectMonth('"+inputId+"', '"+divId+"', '"+year+"', this.value)\" readonly></td>";

		rowCounter++;
		if(rowCounter % weekDays == 0) calendarLayout += "</tr>";
	}

	calendarLayout += "</table>";

	objDiv = document.getElementById(divId);
	objDiv.innerHTML = calendarLayout;
	objDiv.style.display = 'inline';
}


//***** Function select Month *****

function selectMonth(inputId, divId, year, monthName)
{
	month = getMonthNumber(monthName);
	eval(this.returnInitialization(inputId, divId, year, month));
}


//***** Function shows Calendar's Years *****

function showYears(inputId, divId, year, month, previous, next)
{
	weekDays = 3;
	rowCounter = 0;

	if(previous == undefined && next == undefined)
	{
		currentYear = year;
	}
	else
	{
		currentYear = (previous == undefined) ? next : previous;
	}

	currentYear = parseInt(currentYear);

	if(currentYear < 1900) currentYear = 2000;
	else if(currentYear > 2100) currentYear = 2000;

	previous = currentYear - 15;
	next = currentYear + 15;


	calendarLayout = "";	//string variable for storing calendar layout

	calendarLayout += "<table cellspacing='1' cellpadding='0' border='0' width='148' class='calendarTable' onMouseDown=\"moveDivAbove('"+divId+"')\">";

	calendarLayout += this.getTitleRow(divId, weekDays);
	calendarLayout += this.getYearRow(inputId, divId, year, month, weekDays);
	calendarLayout += this.getSelectYearRows(inputId, divId, year, month, weekDays, previous, next);

	for(counter = 0; counter < 15; counter++)
	{
		if(rowCounter % weekDays == 0) calendarLayout += "<tr>";

		calendarLayout += "<td align='center' valign='middle' width='"+Math.floor((12 / weekDays) * 100)+"' class='yearCell'>";
		calendarLayout += "<input name='month' value='"+currentYear+"' class='yearCell' onMouseOver=\"this.className='yearOver'\" onMouseOut=\"this.className='yearCell'\" onClick=\"selectYear('"+inputId+"', '"+divId+"', this.value, '"+month+"')\" readonly></td>";

		currentYear++;
		rowCounter++;
		if(rowCounter % weekDays == 0) calendarLayout += "</tr>";
	}

	calendarLayout += "</table>";

	objDiv = document.getElementById(divId);
	objDiv.innerHTML = calendarLayout;
	objDiv.style.display = 'inline';
}


//***** Function return Calendar's Years Rows *****

function getSelectYearRows(inputId, divId, year, month, weekDays, previous, next)
{
	rowLayout = '';

	rowLayout += "<tr>";
	rowLayout += "<td align='center' valign='middle' colspan='"+weekDays+"' class='monthHeadingRow'>";

	rowLayout += "<table cellspacing='0' cellpadding='1' border='0' width='100%'>";
	rowLayout += "<tr class='monthHeadingRow'>";
	rowLayout += "<td align='center' valign='middle' width='15'>";

	rowLayout += "<a href='javascript:void(0)' onClick=\"javascript:showYears('"+inputId+"', '"+divId+"', '"+year+"', '"+month+"', '"+previous+"', undefined)\"";
	rowLayout += " title='Previous 15 Years' class='linksCalendar'>«</a>";

	rowLayout += "</td>";
	rowLayout += "<td align='center' valign='middle'>Select Year</td>";
	rowLayout += "<td align='center' valign='middle' width='15'>";

	rowLayout += "<a href='javascript:void(0)' onClick=\"javascript:showYears('"+inputId+"', '"+divId+"', '"+year+"', '"+month+"', undefined, '"+next+"')\"";
	rowLayout += " title='Next 15 Years' class='linksCalendar'>»</a>";

	rowLayout += "</td>";
	rowLayout += "</tr>";
	rowLayout += "</table>";

	rowLayout += "</td>";
	rowLayout += "</tr>";

	return rowLayout;
}


//***** Function select Month *****

function selectYear(inputId, divId, year, month)
{
	eval(this.returnInitialization(inputId, divId, year, month));
}


//***** Function formating the Date for inputbox *****

function dateFormate(divId, inputId, yearId, monthId, day)
{
	objHdnYear = document.getElementById(yearId);
	objHdnMonth = document.getElementById(monthId);

	year = objHdnYear.value;
	month = objHdnMonth.value;

	dateString = showDateFormate(year, month, day);
	
	objInputBox = document.getElementById(inputId);
	objInputBox.value = dateString;

	this.closeCalendar(divId);
}