var arr_Months		= new Array("January","February","March","April","May","June","July","August","September","October","November","December") ;
var arr_MInShort	= new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") ;
var arr_Days		= new Array("Su","Mo","Tu","We","Th","Fr","Sa") ;
var arr_Dates 		= new Array(31,28,31,30,31,30,31,31,30,31,30,31) ; 
var obj_Today		= new Date() ;
var int_CDate		= obj_Today.getDate() ;			//day 1-31
var int_CMonth		= obj_Today.getMonth() ;		//month 0-11
var int_CYear		= obj_Today.getFullYear() ;		//year	1970-XXXX
var obj_Today		= new Date(int_CYear,int_CMonth,int_CDate) ;	//remove hrs,mins,....
var obj_Calendar	= null ;						//object for the calendar code
var str_Delimiter	= "/" ;
var int_CalTimer	= null ;
var obj_MTblDate	= new Date() ;					//the date(month) of the calendar
var int_DateCount	= 0 ;							//number of days in the calendar
var int_FirstDay	= 0 ;							//the 1st day of the month in the calendar
var	int_DayCount	= 0 ;							//keep track of day of the week

var arr_UserDates	= new Array() ;					//dates in inputs
var obj_Trigger		= null ;

// ***************  Functions  *************** //

function cal_delimiter(str_Text){
	var str_Delimiter = (str_Text.indexOf("/") > -1) ? "/" : (str_Text.indexOf(".") > -1) ? "." : (str_Text.indexOf("-") > -1) ? "-" : (str_Text.indexOf(",") > -1) ? "," : "/" ;
	return str_Delimiter ;
}

function cal_splittext(str_Text){
	var arr_Split = str_Text.split(cal_delimiter(str_Text)) ;
	return arr_Split ;
}

function cal_isleapyear(int_Y){
	var int_IsLeapY = (int_Y % 4 == 0 && (int_Y % 100 != 0 || int_Y % 400 == 0 )) ? 1 : 0 ;
	return int_IsLeapY ;
}

function cal_checkwithinyr(obj_CheckDate){
	var int_DateDiff = Math.floor((obj_CheckDate - obj_Today) / 86400000) ;	//difference in days between CheckDate and Today
	var boo_CheckDate = (int_DateDiff > 365) ? 1 : 0 ;
	return boo_CheckDate ;
}

function cal_leadingzero(str_Text){
	if (str_Text < 10) str_Text = "0" + str_Text ;
	return str_Text ;
}


// ***************  Methods  *************** //



function cal_setup(cal_Calendar,str_Inputs,int_TopPx,int_LeftPx){ // str_Inputs,int_TopPx By George
	obj_Calendar = document.getElementById(cal_Calendar) ;
	obj_Trigger =  document.getElementById(str_Inputs) ; // By George
	cal_createcard("Header") ;
	cal_buildmonthtbl(int_CMonth,int_CYear) ;
	cal_createcard("Footer") ;
	
	obj_Calendar.style.top = int_TopPx + "px" ; // By George
	obj_Calendar.style.left = int_LeftPx + "px" ; // By George
		
	obj_Calendar.style.display = "block" ;
	obj_Calendar.style.visibility = "visible" ;
	cal_hold() ;
	obj_Calendar.onclick = cal_hold ;
	document.onclick = cal_countdown ;
}

function cal_navmonth(int_M,int_Y){
	cal_createcard("Header") ;
	cal_buildmonthtbl(int_M,int_Y) ;
	cal_createcard("Footer") ;	
}

function cal_hold(){
	setTimeout("clearTimeout(int_CalTimer)",250);
}

function cal_countdown(){
	if (obj_Calendar) int_CalTimer = setTimeout("cal_close()",500) ;
}

function cal_close(){
		obj_Calendar.style.visibility = "hidden" ;
		obj_Calendar.style.display = "none" ;
		obj_Calendar = null ;
}


// ***************  Procedures  *************** //

function cal_createcard(str_Text){
	if (str_Text == "Header"){
		obj_Calendar.innerHTML = '<div class="CardHeader"><a href="#" onclick="cal_close();return false;">x</a></div>' ;
	}else{
		obj_Calendar.innerHTML += '<div class="CardFooter">Today: ' + arr_Days[obj_Today.getDay()] + ',&nbsp;' + arr_MInShort[int_CMonth] + '-' + cal_leadingzero(int_CDate) + '-' + int_CYear + '</div>' ;
	}
}

function cal_buildmonthtbl(int_M,int_Y){
	var str_TblHtml = "" ;	
	obj_MTblDate = new Date(int_Y,int_M,1) ;
	int_DateCount = arr_Dates[int_M] ;
	if (int_M == 1) int_DateCount += cal_isleapyear(int_Y) ;
	int_FirstDay = obj_MTblDate.getDay() ;
	int_DayCount = int_FirstDay ;
	str_TblHtml = '<table class="CalTable" cellspacing="0" cellpadding="0">' ;
	str_TblHtml += cal_buildtblHeader(int_M,int_Y) ;
	str_TblHtml += cal_buildtblBody(int_M,int_Y) ;
	str_TblHtml += '</table>' ;
	obj_Calendar.innerHTML += str_TblHtml ;
}

function cal_buildtblHeader(int_M,int_Y){
	var str_TblHeaderHtml = "" ;
	str_TblHeaderHtml = cal_buildtr(cal_buildcalmonth(int_M,int_Y),"") ;
	str_TblHeaderHtml += cal_buildtr(cal_buildcaldays(),"CalDay") ;
	return str_TblHeaderHtml ;
}

function cal_buildcaldays(){
	var str_CalDaysHtml = "" ;
	for (var i = 0 ; i < arr_Days.length ; i++) str_CalDaysHtml += '<th>' + arr_Days[i] + '</th>' ;
	return str_CalDaysHtml ;
}

function cal_buildcalmonth(int_M,int_Y){
	var str_CalMonthHtml = "" ;
	str_CalMonthHtml = '<th class="NavMonth">' + cal_buildnav("Prev") + '</th>' ;
	str_CalMonthHtml += '<th class="CalMonth" colspan="5">' + arr_Months[int_M] + '&nbsp;' + int_Y + '</th>' ;
	str_CalMonthHtml += '<th class="NavMonth">' + cal_buildnav("Next") + '</th>' ;
	return str_CalMonthHtml ;
}

function cal_buildnav(str_Text){
	var str_NavHtml = "" ;
	var str_NavArrow = "" ;
	var str_NavEventListener = "" ;
	var	str_NavClassName = "" ;
	var obj_MTblNavMonth = new Date() ;
	
	if (str_Text == "Prev"){
		obj_MTblNavMonth = new Date(obj_MTblDate.getFullYear(),obj_MTblDate.getMonth()-1,1);
		str_NavArrow = '&lt;&lt;' ;
		str_NavEventListener = (obj_MTblDate <= obj_Today) ? '' : ' onclick="cal_navmonth(' + (obj_MTblNavMonth.getMonth()) + ',' + obj_MTblNavMonth.getFullYear() + ');return false;"' ;
		str_NavClassName = (obj_MTblDate <= obj_Today) ? ' class="NavOff"' : '' ;
		str_NavHtml = (obj_MTblDate <= obj_Today) ? '<div>&nbsp;</div>' : '<a href="#"' + str_NavClassName + str_NavEventListener +'>' + str_NavArrow + '</a>' ;				
	}else{
		obj_MTblNavMonth = new Date(obj_MTblDate.getFullYear(),obj_MTblDate.getMonth()+1,1) ;
		str_NavArrow = '&gt;&gt;' ;
		str_NavEventListener = (cal_checkwithinyr(obj_MTblNavMonth)) ? '' : ' onclick="cal_navmonth(' + (obj_MTblNavMonth.getMonth()) + ',' + obj_MTblNavMonth.getFullYear() + ');return false;"' ;
		str_NavClassName = (cal_checkwithinyr(obj_MTblNavMonth)) ? ' class="NavOff"' : '' ;
		str_NavHtml = (cal_checkwithinyr(obj_MTblNavMonth)) ? '<div>&nbsp;</div>' : '<a href="#"' + str_NavClassName + str_NavEventListener +'>' + str_NavArrow + '</a>' ;			
	}	
	return str_NavHtml ;
}

function cal_buildtblBody(int_M,int_Y){
	var str_TblBodyHtml = "" ;
	var str_TrInnerHtml = "" ;
	var str_TbCassName = "" ;	
	var int_RowCount = 0 ;
	var obj_CellDate = new Date() ;
	
	str_TrInnerHtml = cal_buildoffdate(int_FirstDay) ;		//blanks before the 1st day of the month
	for (var i = 1 ; i <= int_DateCount ; i++){
		if(int_DayCount == 7){
			str_TblBodyHtml += cal_buildtr(str_TrInnerHtml,"") ;		
			str_TrInnerHtml = "" ;
			int_DayCount = 0 ;
			int_RowCount++ ;
		}
		obj_CellDate = new Date(int_Y,int_M,i) ;
		if (obj_CellDate >= obj_Today && !cal_checkwithinyr(obj_CellDate)){	
			str_TbCassName = (obj_CellDate.valueOf() == obj_Today.valueOf()) ? "CurDate" : "CalDate" ;
			str_TbEventListener = ' onclick="cal_seldate(' + obj_CellDate.getMonth() + ',' + i + ',' + obj_CellDate.getFullYear() + ');return false;"' ;
			str_TrInnerHtml += '<td class="' + str_TbCassName + '"><a href="#"' + str_TbEventListener + '>' + i + '</a></td>' ;
		}else{
			str_TrInnerHtml += '<td class="OffDate"><div>' + i + '</div></td>' ;
		}
	
//			s_caldateaction = "top.cal_dosetdate("+(d_calDate.getMonth()+1)+","+i+","+d_calDate.getFullYear()+");top.cal_close();return false"
//			for(var j=0;j<a_userdates.length;j++){
//				d_testDateRange= (a_userdates[j].month=="") ? new Date(1000,1,1) : new Date(a_userdates[j].year,a_userdates[j].month-1,a_userdates[j].date);
//				d_minuserdate = (a_userdates[j].month=="") ? new Date(1000,1,1) : new Date(a_userdates[j].year,a_userdates[j].month-1,a_userdates[j].date); //d_testDateRange//(a_userdates[0].month!="") ? new Date(a_userdates[0].year,a_userdates[0].month-1,a_userdates[0].date) : new Date(a_userdates[a_userdates.length-1].year,a_userdates[a_userdates.length-1].month-1,a_userdates[a_userdates.length-1].date);
//				d_maxuserdate = (a_userdates[j+1]) ? (a_userdates[j+1].month!="") ? new Date(a_userdates[j+1].year,a_userdates[j+1].month-1,a_userdates[j+1].date) : d_minuserdate : d_minuserdate;
//				s_caldateclass = (d_calDate.valueOf()==d_minuserdate.valueOf()) ? "caldatesel" : (d_calDate>d_minuserdate&&d_calDate<d_maxuserdate&&d_minuserdate.getFullYear()!=1000) ? "caldaterng" : "caldate";

//				switch (s_caldateclass){
//				case "caldatesel":
//				case "caldaterng":
//					j=a_userdates.length;
//				break;
//				}
//			}
		int_DayCount++ ;
	}
	str_TrInnerHtml += cal_buildoffdate(7 - int_DayCount) ;		//blanks after the end day of the month
	str_TblBodyHtml += cal_buildtr(str_TrInnerHtml,"") ;	
	if (int_RowCount < 5) str_TblBodyHtml += cal_buildtr(cal_buildoffdate(7),"") ;
	return str_TblBodyHtml ;
}

function cal_buildtr(str_TrInnerHtml,str_TrCassName){
	var str_TrHtml = (str_TrCassName == "") ? '<tr>' : '<tr class="' + str_TrCassName + '">' ;
	str_TrHtml += str_TrInnerHtml ;
	str_TrHtml += '</tr>' ;
	return str_TrHtml ;
}

function cal_buildoffdate(int_Blank){
	var str_OffDateHtml = "" ;
	for (var i = 0 ; i < int_Blank ; i++) str_OffDateHtml += '<td class="OffDate"><div>&nbsp;</div></td>' ;
	return str_OffDateHtml ;
}

// ********************************************************* //
function cal_getdateinputs(str_Inputs){
	var arr_UserInputs = cal_splittext(str_Inputs);
	for (var i = 0 ;  i < arr_UserInputs.length ; i++) arr_UserDates[i] = new cal_userdate(document.getElementById(arr_UserInputs[i]).value) ;
}

function cal_userdate(str_InputValue){
	this.date = "" ;
	this.month = "" ;
	this.year = "" ;
	this.delimiter = cal_delimiter(str_InputValue) ;
	var	arr_InputValue = cal_splittext(str_InputValue) ;
	if (cal_validdate(arr_InputValue)){
			this.month = arr_InputValue[0] ;
			this.date = arr_InputValue[1] ;
			this.year = arr_InputValue[2] ;	
	}
}

function cal_validdate(arr_InputValue){
	boo_Validate = 1 ;
	if (arr_InputValue.length != 3) boo_Validate = 0 ;
	if (boo_Validate){
		for (var i = 0 ; i < arr_InputValue.length ; i++){
			arr_InputValue[i] = parseInt(arr_InputValue[i],10) ;
			if(isNaN(arr_InputValue[i])) boo_Validate = 0 ;
		}
		if (boo_Validate){
			if (arr_InputValue[2] < 2000) arr_InputValue[2] += 2000 ;
			if (arr_InputValue[2] < int_CYear || arr_InputValue[2] > int_CYear + 1) boo_Validate = 0 ;
			if (arr_InputValue[0] < 1 || arr_InputValue[0] > 12) boo_Validate = 0 ;
			if (arr_InputValue[1] < 1 || arr_InputValue[1] > arr_Dates[arr_InputValue[0]-1] + cal_isleapyear(arr_InputValue[2])) boo_Validate = 0 ;
		}
	}
	return boo_Validate ;
}

function cal_seldate(int_M,int_D,int_Y){
	int_M = cal_leadingzero(int_M + 1) ;
	int_D = cal_leadingzero(int_D) ;
	obj_Trigger.value = int_M + str_Delimiter + int_D + str_Delimiter + int_Y ;
	cal_close() ;
}