// Author     : Raghu M

// Declaration of global variables
var BUL_YEARSCROLL = true;
var calendars = [];
var RE_NUM = /^\-?\d+$/;
var monthAry =['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];	
var ARR_MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var ARR_WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"];
var NUM_WEEKSTART = 0;
var currDate;
var dt_current;
var passedDate;
var dt_firstday;
var curday;
var curmon;
var year_scroll = BUL_YEARSCROLL;
var sysDate = ''
var targetDisplayCol = '';
var mflag 	= 0;
var ctflag	= 0;
var isIE6 = (/MSIE 6/i.test(navigator.userAgent))? true : false;

// Common date manipulation functions


// getMonthNumberFromShortMonth
// ------------------------
// Get the month number from the short string Jan = 0

function getMonthNumberFromShortMonth(sval) {

	for(var i=0;i<monthAry.length;i++) {
		if(sval == monthAry[i]) {
			return i;
		}
	}
}


// getMonthStringFromNumber
// ------------------------
// Get the month short string from the month number 0 = Jan

function getMonthStringFromNumber(sval) {
	return monthAry[Number(sval)-1];
}


// formatDateForBusSvcs
// ------------------------
// Build the business services date format ddmmyyyy (or dd/mm/yyy if slashes='Y') from dd-mon-yyyy

function formatDateForBusSvcs(vardt, slashes)
{
	if (vardt != "" && vardt != null) {
		
		var arrayDate = vardt.split("-");
			
		var dt = arrayDate[0];
		var mon = getMonthNumberFromShortMonth(arrayDate[1]);
		var year = arrayDate[2];
		var fdt;
		
		if (slashes == "Y") {
			fdt = dt + "/" + (mon <= 9 ? '0' : '') + mon + "/" + year;
		}
		else {
			fdt = dt + (mon <= 9 ? '0' : '') + mon + year;
		}
	
		return fdt;
	}
}


// formatDisplayDateFromBusSvcs
// ----------------------------
// Build dd-mon-yyyy from ddmmyyyy

function formatDisplayDateFromBusSvcs(vardt)
{
	if (vardt != "" && vardt != null) {
		
		var fy = vardt.substr(a.length-4,4) + '';
		var fm = getMonthStringFromNumber(vardt.substr(2,2)) + '';
		var fd = vardt.substr(0,2) + '';
	
		var dt = fy+fm+fd;

		//alert ("formatDisplayDateFromBusSvcs " + vardt + " : " + dt );
	
		return dt;
	}
}


// formatDisplayDateFromJSDate
// ---------------------------
// generate dd-mon-yyyy from a javascript Date

function formatDisplayDateFromJSDate (dt_datetime) {
	
	return (
		(dt_datetime.getDate() <= 9 ? '0' : '') + dt_datetime.getDate() + "-"
		+ (monthAry[dt_datetime.getMonth()] <= 9 ? '0' : '') + (monthAry[dt_datetime.getMonth()] ) + "-"
		+ dt_datetime.getFullYear()
	);
}


// getJSDateFromDisplayDate
// ------------------------
// generate a javascript date from dd-mon-yyyy

function getJSDateFromDisplayDate (displayDate) {
	
	var arrayDate = displayDate.split("-");
		
	var dt = arrayDate[0];
	var mon = getMonthNumberFromShortMonth(arrayDate[1]);
	var year = arrayDate[2];
	
	var returnDate = new Date(year, mon , dt)//new Date(y,m,d);
	
	//alert("getJSDateFromDisplayDate " + displayDate + " : " + returnDate);
	
	return returnDate;
}


// increasedatebydays
// ------------------------
// increase a display date by a certain number of days

function increasedatebydays(strdtvalue, noofdays) {

	// Get the JS Date from the display date
	var dtvalue = getJSDateFromDisplayDate(strdtvalue);
	dtvalue = dtvalue.valueOf() + (noofdays > 0 ? (60*60*(24*noofdays)*1000):0);
	
	// Convert the JS date back to display date
	return formatDisplayDateFromJSDate(new Date(dtvalue));
}


// getSystemDate
// -------------
// Get the date from our servers (rather than using browser JS date which may be set wrong and subject to TZ issues)

function getSystemDate() {
	//LoadAjaxCallFunction('/modules/travelCalendar/getSystemDate.jsp', "", systemDateCallback);
	systemDateCallback();
}


// systemDateCallback
// ------------------
// Process the returned date from the ajax call

function systemDateCallback() {

	//sysDate = getJSDateFromDisplayDate(trim(returnBuffer));
	sysDate = new Date();
	//alert(sysDate)
	currDate 	= new Date(sysDate);
	dt_current 	= new Date(currDate);
	dt_firstday = new Date(dt_current);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);
	curday = currDate.getDate();
	curmon = currDate.getMonth();	
	
}


// get month
function getmontharray() {
	var CalToday = currDate;
	var montharray	= new Array();
	var yeararray	= new Array();
	var startmonth	= CalToday.getMonth();
	var startyear	= CalToday.getFullYear();
	var yearcount = 0;
	for (var i=0;i<12;i++) {
		montharray[i]	= monthAry[startmonth++]
		yeararray[i]	= startyear;
		if(startmonth >=12) {
			startmonth = startmonth - 12;
			if(yearcount == 0) {
				startyear = startyear + 1;
				yearcount++;
			}
		}
	}
	var display = "<ul class='cal-m'>";
	for (var j=0;j<12;j++) {
	
		if(montharray[j] == monthAry[dt_current.getMonth()])
			display = display + '<li><a class="selected" href="javascript:changemonth(\''
							  +montharray[j]
							  +'\',\''
							  +yeararray[j]
							  +'\')">'+montharray[j]+'</a></li>';
		else
			display = display + '<li><a href="javascript:changemonth(\''
							  +montharray[j]
							  +'\',\''
							  +yeararray[j]
							  +'\')">'+montharray[j]+'</a></li>';
	}
	display = display + "</ul>"
	document.getElementById("displaymonth").innerHTML = display;
}


// changemonth
// -----------
// Change the month on the calendar

function changemonth(mon,year) {
	var nmon	= 0;
	var nyear	= year;
	var ndate	= 1;
	curday = ndate;
	
	for(var i=0;i<monthAry.length;i++) {
		if(monthAry[i] == mon) {
			nmon = i;
			break;
		}
	}
	
	setnewDate(new Date(nyear,nmon,ndate));
}


// set new date
function set_newdate(dtchangeflag, yearrest) {
	var curmonyear 	= currDate.getFullYear() + '' + (Number(currDate.getMonth()) <= 9 ? '0'+ currDate.getMonth(): currDate.getMonth());
	var dtmonyear 	= 0;
	
	if( dtchangeflag == "next_month" )
		dtmonyear  = dt_current.getFullYear() + '' + ((Number(dt_current.getMonth())+ 1) <= 9 ? '0'+ (dt_current.getMonth()+ 1): (dt_current.getMonth() + 1 ));
	else if(dtchangeflag == "next_year" )
		dtmonyear  = (dt_current.getFullYear() + 1) + '' + (Number(dt_current.getMonth()) <= 9 ? '0'+ dt_current.getMonth(): dt_current.getMonth());
	else if(dtchangeflag == "next_5year" )
		dtmonyear  = (dt_current.getFullYear() + 5) + '' + (Number(dt_current.getMonth()) <= 9 ? '0'+ dt_current.getMonth(): dt_current.getMonth());
		
	if( dtchangeflag == "prev_month" )
		dtmonyear  = dt_current.getFullYear() + '' + ((Number(dt_current.getMonth())- 1) <= 9 ? '0'+ (dt_current.getMonth()- 1): (dt_current.getMonth() - 1 ));
	else if(dtchangeflag == "prev_year" )
		dtmonyear  = (dt_current.getFullYear() - 1) + '' + (Number(dt_current.getMonth()) <= 9 ? '0'+ dt_current.getMonth(): dt_current.getMonth());
	else if(dtchangeflag == "prev_5year" )
		dtmonyear  = (dt_current.getFullYear() - 5) + '' + (Number(dt_current.getMonth()) <= 9 ? '0'+ dt_current.getMonth(): dt_current.getMonth());
	if( (ctflag == 0) || ((ctflag == 1) && (dtmonyear <= curmonyear) ) || ((ctflag == 2) && (dtmonyear >= curmonyear) ) ) {
		var changedDate	 = new Date(dt_current);
		var tempdate = new Date(currDate);
		if(yearrest == "limited")
			tempdate.setMonth(tempdate.getMonth() + 11);

		if(dtchangeflag == "prev_month") {
			if(yearrest == "limited") {
				changedDate.setMonth(changedDate.getMonth() - 1);
				if(Number(changedDate.getFullYear() +''+ (changedDate.getMonth() <=9 ? '0'+ changedDate.getMonth() : changedDate.getMonth())) < curmonyear)
					changedDate = new Date(tempdate);
			}	
			else
				changedDate.setMonth(changedDate.getMonth() - 1);	
			
		}	
		else if(dtchangeflag == "prev_5year") {
			changedDate.setFullYear(changedDate.getFullYear() - 5);
		}	
		else if(dtchangeflag == "prev_year") {
				changedDate.setFullYear(changedDate.getFullYear() - 1);
		}	
		else if(dtchangeflag == "next_month") {
			if(yearrest =="limited") {
				changedDate.setMonth(changedDate.getMonth() + 1);
				if(Number(changedDate.getFullYear() +''+ (changedDate.getMonth() <=9 ? '0'+changedDate.getMonth(): changedDate.getMonth())) > Number(tempdate.getFullYear() +''+ (tempdate.getMonth() <=9 ? '0'+tempdate.getMonth(): tempdate.getMonth())))
					changedDate = new Date(currDate);
			}	
			else
				changedDate.setMonth(changedDate.getMonth() + 1);
		}	
		else if(dtchangeflag == "next_5year") {
			changedDate.setFullYear(changedDate.getFullYear() + 5);
		}	
		else if(dtchangeflag == "next_year") {
			changedDate.setFullYear(changedDate.getFullYear() + 1);
		}	
		setnewDate(changedDate);
	}	
}

// set new date
function setnewDate(dt_changed_date) {
	var CalToday = new Date(dt_changed_date);	
	dt_current = CalToday;
	dt_firstday = new Date(dt_current);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);
	curday = currDate.getDate();
	curmon = currDate.getMonth();
	set_datetime(CalToday.valueOf());
}


// set new date and time
function set_datetime(n_datetime, b_close) {
	var dt_datetime = new Date(n_datetime);
	document.getElementById("calendarcover").style.display ='none';
	if(isIE6){document.getElementById("calendarIframe").style.display='none';}
	
	if (b_close) {
		document.getElementById(targetDisplayCol).value = formatDisplayDateFromJSDate(dt_datetime);
		document.getElementById("calendar-1").style.display = 'none';
	}
	else
		displayCalendar(targetDisplayCol, formatDisplayDateFromJSDate(dt_datetime));

		if(targetDisplayCol=="FromDate1" && document.getElementById("FromDate2"))
		{
			if(document.getElementById("FromDate2").value != "dd-mon-yyyy")
			{
				var formattedDate = getJSDateFromDisplayDate(document.getElementById("FromDate2").value);

				formattedDate.setHours("0");
				formattedDate.setMinutes("0");
				formattedDate.setSeconds("0");
				dt_datetime.setSeconds("01");
				
				if(dt_datetime>formattedDate)
				{   
					newDate=new Date;
					newDate=dt_datetime;
					newDate.setDate(dt_datetime.getDate()+7)
					formattedDate=newDate;
					document.getElementById("FromDate2").value = formatDisplayDateFromJSDate(formattedDate);
				}
			}
		}
}


// close calendar div
function closecal() {
	document.getElementById("calendar-1").style.display ='none';
	document.getElementById("calendarcover").style.display ='none';
	if(isIE6){document.getElementById("calendarIframe").style.display='none';}
}


// parseAndLoadDate
function parseAndLoadDate(txtfieldid, txtfieldvalue) {
	
	if((txtfieldvalue != 'dd-mon-yyyy') && (txtfieldvalue != '') ) {
		
		// Get the JS Date from the display date
		dt_current = getJSDateFromDisplayDate(txtfieldvalue);
		
		dt_firstday = new Date(dt_current);
		dt_firstday.setDate(1);
		dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);
		curday = currDate.getDate();
		curmon = currDate.getMonth();
		passedDate = new Date(dt_current);
	}	
	else {
		dt_current = new Date(currDate);
		dt_firstday = new Date(dt_current);
		dt_firstday.setDate(1);
		dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);
		curday = currDate.getDate();
		curmon = currDate.getMonth();
		passedDate = new Date(sysDate);
	}	

}



// display calendar
function displayCalendar(targetcol, displayDate) {


	var caldata = '';
	var dispdtmonyear  = 0;
	if(!currDate){currDate = new Date();}
	//if(siteId == 12){
		var dispcurmonyear = currDate.getFullYear() + '' + (Number(currDate.getMonth()) <= 9 ? '0'+ currDate.getMonth(): currDate.getMonth()) + '' + (Number(currDate.getDate()+2) <= 9 ? '0'+ currDate.getDate(): currDate.getDate()+3);
	//}
	//else{
	//	var dispcurmonyear = currDate.getFullYear() + '' + (Number(currDate.getMonth()) <= 9 ? '0'+ currDate.getMonth(): currDate.getMonth()) + '' + (Number(currDate.getDate()) <= 9 ? '0'+ currDate.getDate(): currDate.getDate());
	//}
		
	targetDisplayCol = targetcol;

	document.getElementById("displaymonth").innerHTML = '';
	document.getElementById("displayDates").innerHTML = '';
	

	if ( targetcol == "FromDate1" )	{	
			parseAndLoadDate(targetcol, displayDate);
	}

	else if(targetcol == "FromDate2") {
		if( ((document.getElementById("FromDate1").value != 'dd-mon-yyyy') && (document.getElementById("FromDate1").value != '')) && 
			((displayDate == 'dd-mon-yyyy') || (displayDate == '')) )		
			parseAndLoadDate("FromDate2", increasedatebydays(document.getElementById("FromDate1").value,7));
		else
			parseAndLoadDate(targetcol, displayDate);
	}	
	
	else if(targetDisplayCol == "FromDate3") {
		if( ((document.getElementById("FromDate2").value != 'dd-mon-yyyy') && (document.getElementById("FromDate2").value != '')) && 
			((displayDate == 'dd-mon-yyyy') || (displayDate == '')) )		
			parseAndLoadDate("FromDate3", increasedatebydays(document.getElementById("FromDate2").value,7));
		else
			parseAndLoadDate(targetcol, displayDate);
	}	
	else
		parseAndLoadDate(targetcol, displayDate);

	
	mflag 	= 0;
	ctflag	= 0;
	getmontharray();
	
	
	// Build the current month and the movement icons line
	
	caldata = caldata + "<table class='cal-nav'><tr><th>";
	caldata = caldata + "<a href=javascript:set_newdate('prev_month','limited')><img src='/images/calendar/cal-arrow-left.gif' width='4' height='8' align='absmiddle' alt='back' /></a>";
	caldata = caldata + ARR_MONTHS[dt_current.getMonth()]+' '+dt_current.getFullYear() ;
	caldata = caldata + "<a href=javascript:set_newdate('next_month','limited')><img src='/images/calendar/cal-arrow-right.gif' width='4' height='8' align='absmiddle' alt='forward' /></a></th></tr></table>";
	

	// Build the day and day headers
	caldata = caldata + "<table class='cal-d'>";

	// print weekdays titles
	for (var n=0; n<7; n++)
		caldata = caldata + "<th scope='col' width=30>" + ARR_WEEKDAYS[(NUM_WEEKSTART+n)%7] + "</th>";

	// print calendar table
	var dt_current_day = new Date(dt_firstday);
	var selectedDate  = passedDate.getFullYear() + '' + (Number(passedDate.getMonth()) <= 9 ? '0'+ passedDate.getMonth(): passedDate.getMonth())+ '' + (Number(passedDate.getDate()) <= 9 ? '0'+ passedDate.getDate(): passedDate.getDate());
	
	while (dt_current_day.getMonth() == dt_current.getMonth() || dt_current_day.getMonth() == dt_firstday.getMonth()) 
	{
		// print row header
		caldata = caldata + '<tr>';

		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
	
			dispdtmonyear  = dt_current_day.getFullYear() + '' + (Number(dt_current_day.getMonth()) <= 9 ? '0'+ dt_current_day.getMonth(): dt_current_day.getMonth())+ '' + (Number(dt_current_day.getDate()) <= 9 ? '0'+ dt_current_day.getDate(): dt_current_day.getDate());
	
			// print working days of current month
			caldata = caldata + "<td>";
	
			if (dt_current_day.getMonth() == curmon ) { 

				if( dispdtmonyear > dispcurmonyear)   {		

					if (dispdtmonyear == selectedDate ) {
						caldata = caldata 	+"<a href='javascript:set_datetime(" + dt_current_day.valueOf() + ", true);' class='selected' title='" + ARR_MONTHS[passedDate.getMonth()] + " " + passedDate.getDate() + "'>";
					} else {
						caldata = caldata + "<a href='javascript:set_datetime(" +dt_current_day.valueOf() + ", true);'>";
					}
				}
				else if( dispdtmonyear == dispcurmonyear)  {		
					caldata = caldata 	+"<a href='javascript:set_datetime(" + dt_current_day.valueOf() + ", true);' class='today' title='" + ARR_MONTHS[currDate.getMonth()] + " " + currDate.getDate() + "'>";
				}else{
					caldata = caldata 	+"<a href='javascript:void(0)' class='n-a'>";
				}
			}
			else {
				if( dispdtmonyear > dispcurmonyear)   {	
					if (dispdtmonyear == selectedDate ) {
						caldata = caldata 	+"<a href='javascript:set_datetime(" + dt_current_day.valueOf() + ", true);' class='selected' title='" + ARR_MONTHS[passedDate.getMonth()] + " " + passedDate.getDate() + "'>";
					} else {
						caldata = caldata + "<a href='javascript:set_datetime(" +dt_current_day.valueOf() + ", true);'>";
					}
				}
				else caldata = caldata 	+"<a href='javascript:void(0)' class='n-a'>";
			}
	
			if( dt_current_day.getMonth() == dt_current.getMonth() ) {
				caldata = caldata 	+ dt_current_day.getDate() + "</a></td>";
			}
			else {
				if( dispdtmonyear > dispcurmonyear)   {
					caldata = caldata + "<font style='color:#cccccc;'>" + dt_current_day.getDate() + "</font></a></td>";

				}
			}
			
			dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		caldata = caldata 	+'</tr>';
	}

	caldata = caldata + "</table>";

	var x = 0;
	var y = 0;

	if(targetDisplayCol.indexOf("CalBelow") != -1) {
		x = findPosX(document.getElementById(targetDisplayCol)) -20;
		y = findPosY(document.getElementById(targetDisplayCol)) + 30;
	}
	else if(targetDisplayCol.indexOf("Cal2") != -1) {
		x = findPosX(document.getElementById(targetDisplayCol)) + 140;
		y = findPosY(document.getElementById(targetDisplayCol)) - 50;
	}
	else if(targetDisplayCol.indexOf("Cal") != -1) {
		x = findPosX(document.getElementById(targetDisplayCol)) + 280;
		y = findPosY(document.getElementById(targetDisplayCol)) - 50;
	}
	else {
		x = findPosX(document.getElementById(targetDisplayCol)) +200;
		y = findPosY(document.getElementById(targetDisplayCol)) - 100;
	}	

	document.getElementById("calendar-1").style.top = y+"px";
	document.getElementById("calendar-1").style.left = x+"px";
	
	document.getElementById("calendarcover").style.top=y+"px";
	document.getElementById("calendarcover").style.left=x+"px";
	document.getElementById("calendarcover").style.display="block";
	
	document.getElementById("displaymonth").style.display = '';
	document.getElementById("displayDates").innerHTML = caldata;
	document.getElementById("displayDates").style.display = '';
	document.getElementById("calendar-1").style.display = '';	
	
	if( isIE6 ){ 
		document.getElementById("calendarIframe").style.top=y+15+"px";
		document.getElementById("calendarIframe").style.left=x+"px";
		document.getElementById("calendarIframe").style.display="block";
	}
}
getSystemDate();
