var calDOMID = false;
var calDOMAll = false;
var calDOMLayers = false;
var calBrowerMajorVersion = parseInt(navigator.appVersion);
var calBrowserIsIE = false;
var calBrowserIsNS = false;
if (navigator.appName.indexOf('Microsoft Internet Explorer')!=-1){
	calBrowserIsIE = true;
}
if (navigator.appName.indexOf('Netscape')!=-1){
	calBrowserisNS = true;
}

// Get DOM Objects in cross-platform environment
if(document.getElementById){
	// W3C ID DOM
	// Netscape 6, MSIE 5+
	calDOMID = true;
}else if(document.all){
	// MSIE 5+
	calDOMAll = true;
}else if((navigator.appName.indexOf('Netscape')!=-1) && browerMajorVersion==4){
	// Netscape 4
	calDOMLayers = true;
}
function calReturnDOMObject(objectID){
	if(calDOMID){
		return (document.getElementById(objectID));
	}else if(calDOMAll){
		return (document.all[objectID]);
	}else if(calDOMLayers){
		return (document.layers[objectID]);
	}
}

function calReturnDOMObjectStyle(objectID){
	if(calDOMID){
		return (document.getElementById(objectID).style);
	}else if(calDOMAll){
		return (document.all[objectID].style);
	}else if(calDOMLayers){
		return (document.layers[objectID]);
	}
}

function calChangeObjectContents(objectID, newContents){
	calReturnDOMObject(objectID).innerHTML = newContents;
}

function displayObjectContents(objectID){
	alert(calReturnDOMObject(objectID).innerHTML);
}


// Visibility
function calSetObjectVisibility(objectID, newVisibilityState){
	// Options for newVisibilityState:
	// 1. 'hidden'
	// 2. 'visible'
	calReturnDOMObjectStyle(objectID).visibility = newVisibilityState;
}






function setCalendarField(fieldName,formName,fieldValue){
	eval('document.'+formName+'.'+fieldName).value=fieldValue;
}
var todaysDate=new Date();
//var selectedDate;
//var theCalendar;
// Month and Day Name Arrays
var monthNamesArray=['January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'];
var weekdayNamesArray=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
//  Current value of the date/time field prior to modification
var currentDateTime;
// Display the Month and Year Header
var showMonthAndYearHeader=false;

function createCalendar(dateField,showTime,newWindowPositionX,newWindowPositionY){
	dateFieldName = dateField.name;
	dateFormName = dateField.form.name;
	self[dateFieldName + 'Calendar'] = new Calendar(todaysDate,dateFieldName,dateFormName,showTime);
	theCalendar=self[dateFieldName + 'Calendar'];
	if ((showTime!=null) && (showTime)){
		theCalendar.ShowTime=true;
	}
	currentDateTime = dateField.value;

	if (dateField.value!=''){
		setTempCalendarDate(dateFieldName,currentDateTime,true);
	}else{
		theCalendar.Month=createTwoCharacterNumber(todaysDate.getMonth()+1);
		theCalendar.Day=createTwoCharacterNumber(todaysDate.getDate());
		theCalendar.Year=todaysDate.getFullYear();
		theCalendar.Hours=createTwoCharacterNumber(todaysDate.getHours());
		theCalendar.Minutes=createTwoCharacterNumber(todaysDate.getMinutes());
		theCalendar.Seconds=createTwoCharacterNumber(todaysDate.getSeconds());
		
		theCalendar.SelectedMonth=theCalendar.Month;
		theCalendar.SelectedDay=theCalendar.Day;
		theCalendar.SelectedYear=theCalendar.Year;
		theCalendar.SelectedHours=theCalendar.Hours;
		theCalendar.SelectedMinutes=theCalendar.Minutes;
		theCalendar.SelectedSeconds=theCalendar.Seconds;
	}
	renderCalendar(dateFieldName);
}

function renderCalendar(dateFieldName){
	theCalendar = self[dateFieldName + 'Calendar'];
	//alert('year: '+theCalendar.Year+'\nmonth: '+theCalendar.Month+'\nday: '+theCalendar.Day+'\nhours: '+theCalendar.Hours+'\nminutes: '+theCalendar.Minutes+'\nDays in month: '+theCalendar.getNumberOfDaysInMonth());
	calendarDivContents = '';	
	calendarHeaderRenderString = '';
	calendarHeaderRenderString += '<div class="calendar">';
	calendarHeaderRenderString +=	'<table cellpadding="0" cellspacing="0" border="0" width="100%">';
	calendarHeaderRenderString +=		'<tr>';
	calendarHeaderRenderString +=			'<td class="calendarCurrentMonthCell" colspan="7" align="center">';
	
	//Month Selector
	calendarHeaderRenderString +=				'<select name="MonthSelector" class="calendarCurrentMonthCell" onChange="theCalendar.changeMonthSelection(\''+dateFieldName+'\',this.selectedIndex+1);renderCalendar(\''+dateFieldName+'\');">';
								for (i=1;i<=12;i++){
									if (i==theCalendar.Month){
										isSelectedString='selected';
									}else{
										isSelectedString='';
									}
									calendarHeaderRenderString+='<option '+isSelectedString+'>'+monthNamesArray[i-1];
								}
	calendarHeaderRenderString +=				'</select>';
	//Year selector
	calendarHeaderRenderString +=				'<a href="#" class="calendarCurrentYearCell" onclick="theCalendar.decreaseYear(10,\''+dateFieldName+'\');renderCalendar(\''+dateFieldName+'\');return false;"><<</a>';
	calendarHeaderRenderString +=				'<a href="#" class="calendarCurrentYearCell" onclick="theCalendar.decreaseYear(1,\''+dateFieldName+'\');renderCalendar(\''+dateFieldName+'\');return false;"><</a>';
	calendarHeaderRenderString +=				'<font class="calendarCurrentYearCell">'+theCalendar.Year+'</font>';
	calendarHeaderRenderString +=				'<a href="#" class="calendarCurrentYearCell" onclick="theCalendar.incrementYear(1,\''+dateFieldName+'\');renderCalendar(\''+dateFieldName+'\');return false;">></a>';
	calendarHeaderRenderString +=				'<a href="#" class="calendarCurrentYearCell" onclick="theCalendar.incrementYear(10,\''+dateFieldName+'\');renderCalendar(\''+dateFieldName+'\');return false;">>></a>';
	calendarHeaderRenderString +=			'</td>';
	calendarHeaderRenderString +=		'</tr>';
	
	//Calendar header shows Month and Year
	if (showMonthAndYearHeader){
		calendarHeaderRenderString +=		'<tr>';
		calendarHeaderRenderString +=			'<td class="calendarCurrentMonthCell" colspan="7" align="center">';
		calendarHeaderRenderString +=				monthNamesArray[theCalendar.Month-1]+'  '+theCalendar.Year;
		calendarHeaderRenderString +=			'</td>';
		calendarHeaderRenderString +=		'</tr>';
	}
	
	// WEEK DAY HEADERS
	calendarHeaderRenderString +=		'<tr class="calendarDayNameCell">';
	for (i=0;i<7;i++){
		calendarHeaderRenderString +=			'<td class="calendarDayNameCell">'+weekdayNamesArray[i]+'</td>';
	}
	calendarHeaderRenderString +=		'</tr>';
	
	calendarDivContents += calendarHeaderRenderString;	
	
	//Calendar detail
	CalDate=new Date(theCalendar.Year,theCalendar.Month-1, 1);
	//CalDate=new Date(theCalendar.Year,theCalendar.Month);
	//CalDate.setDate(1);
	firstDayNumber=CalDate.getDay();
	calendarRenderString='<tr>';
	var dayNumber=0;
	for (i=0;i<firstDayNumber;i++){
		dayNumber++;
		calendarRenderString+=drawCalendarCell(dateFieldName,'','','calendarNonDayCell',theCalendar.showTime);
	}
	for (j=1;j<=theCalendar.getNumberOfDaysInMonth();j++){
		dayNumber++;
		dayString = createTwoCharacterNumber(j);
		monthString = createTwoCharacterNumber(theCalendar.Month);
		dateString = theCalendar.Year.toString() + monthString + dayString;
		if ((dayNumber+6)%7==0){
			// SUNDAY
			calendarRenderString+='<tr>';
		}
		if((j==theCalendar.Day)&&(theCalendar.Month==theCalendar.SelectedMonth)&&(theCalendar.Year==theCalendar.SelectedYear)){
			// Currently Selected Day
			calendarRenderString+=drawCalendarCell(dateFieldName,j,dateString,'selectedDayCell',theCalendar.showTime);
		}else if((j==todaysDate.getDate())&&(theCalendar.Month==(todaysDate.getMonth()+1))&&(theCalendar.Year==todaysDate.getFullYear())){
			// TODAY
			calendarRenderString+=drawCalendarCell(dateFieldName,j,dateString,'currentDayCell',theCalendar.showTime);
		}else{	 
			if (dayNumber%7==0){
				// SATURDAY
				calendarRenderString+=drawCalendarCell(dateFieldName,j,dateString,'weekendDayCell',theCalendar.showTime);
			}else if ((dayNumber+6)%7==0){
				// SUNDAY
				calendarRenderString+=drawCalendarCell(dateFieldName,j,dateString,'weekendDayCell',theCalendar.showTime);
			}else{
				calendarRenderString+=drawCalendarCell(dateFieldName,j,dateString,'weekDayCell',theCalendar.showTime);
			}
		}		
		if (dayNumber%7==0){
			// SATURDAY
			calendarRenderString+='</tr>';
		}
		//if((dayNumber%7==0)&&(j<theCalendar.getNumberOfDaysInMonth())){
		//	calendarRenderString+='</tr><tr>';
		//}
	}
	
	// Render Trailing Blanks
	numberOfTrailingBlankDaysRequired = 7 - ((i+j-1)%7);
	//alert(i+'/'+j+'/'+ numberOfTrailingBlankDaysRequired)
	if(numberOfTrailingBlankDaysRequired<7){
		for (k=0;k<numberOfTrailingBlankDaysRequired;k++){
			calendarRenderString+=drawCalendarCell(dateFieldName,'','','calendarNonDayCell',theCalendar.showTime);
			dayNumber++;
		}
		calendarRenderString+='</tr>';
	}
	calendarDivContents += calendarRenderString;
	
	
	
	//Calendar time
	if (theCalendar.showTime){
		timeRenderString='<tr>';
		timeRenderString+=	'<td colspan="7" align="center" class="timeSelector" height="30">';
		timeRenderString+=		'<select name="'+dateFieldName+'Hours" class="timeSelector">';
								for (i=1;i<=12;i++){
									if(i<10){
										hourString = '0' + i.toString();
									}else{
										hourString = i;
									}
									if(theCalendar.SelectedHours >= 12){
										minorSelectedHours = theCalendar.SelectedHours - 12;
									}else{
										minorSelectedHours = theCalendar.SelectedHours;
									}
									
									if(i==minorSelectedHours){
										timeRenderString+='<option value="'+hourString+'" selected>'+hourString+'</option>';
									}else if(i==12 && eval(minorSelectedHours)==0){
										timeRenderString+='<option value="00" selected>'+hourString+'</option>';
									}else if(i==12){
										timeRenderString+='<option value="00">'+hourString+'</option>';
									}else{
										timeRenderString+='<option value="'+hourString+'">'+hourString+'</option>';
									}
								}
		timeRenderString+=		'</select>';
		timeRenderString+=		':';
		timeRenderString+=		'<select name="'+dateFieldName+'Minutes" class="timeSelector">';
								for (j=0;j<60;j++){
									if(j<10){
										minuteString = '0' + j.toString();
									}else{
										minuteString = j;
									}
									if(j==theCalendar.SelectedMinutes){
										timeRenderString+='<option value="'+minuteString+'" selected>'+minuteString+'</option>';
									}else{
										timeRenderString+='<option value="'+minuteString+'">'+minuteString+'</option>';
									}
								}
		timeRenderString+=		'</select>';
		timeRenderString+=		':';
		timeRenderString+=		'<select name="'+dateFieldName+'AMPM" class="timeSelector">';
								if(eval(theCalendar.SelectedHours)>=12){
									timeRenderString+='<option value="AM">AM</option>';
									timeRenderString+='<option value="PM" selected>PM</option>';
								}else{
									timeRenderString+='<option value="AM" selected>AM</option>';
									timeRenderString+='<option value="PM">PM</option>';
								}
		timeRenderString+=		'</select>';
		timeRenderString+=	'</td>';
		timeRenderString+='</tr>';
		calendarDivContents += timeRenderString;
	}
	

	calendarDivContents += '<tr><td colspan="7" class="calendarClearCell" align="center">';
	if(theCalendar.showTime){
		calendarDivContents += '<a class="calendarButton calendarSetButton" href="#" onclick="setCalendarDate(\''+theCalendar.dateFormName+'\',\''+dateFieldName+'\',true);return false;">set</a>';
	}else{
		calendarDivContents += '<a class="calendarButton" href="#" onclick="setCalendarDate(\''+theCalendar.dateFormName+'\',\''+dateFieldName+'\',false);return false;">set</a>';
	}
	calendarDivContents += '<a href="#" class="calendarButton" onclick="setCalendarField(\''+dateFieldName+'\',\''+theCalendar.dateFormName+'\',\'\');calSetObjectVisibility((\'cal_'+dateFieldName+'\'),\'hidden\');calChangeObjectContents((\'cal_'+dateFieldName+'\'),\'\');calChangeObjectContents((\'calDisplay_'+dateFieldName+'\'),\'\');'+dateFieldName+'IsVisible=false;return false;">clear</a>';
	calendarDivContents += '</td></tr>';
	calendarDivContents += '</table><div class="calendarClearBoth"></div></div></form>';
	calChangeObjectContents(('cal_'+dateFieldName),calendarDivContents);
	//eval('document.'+theCalendar.dateFormName+'.divDisplay).value=calendarDivContents;
}

function drawCalendarCell(dateFieldName,cellDayNumber,cellValue,cellClass,showTime){
	theCalendar = self[dateFieldName + 'Calendar'];
	if(cellValue==null){
		cellValue='';
	}
	if(cellClass=='calendarNonDayCell'){
		cellCode='<td class="calendarNonDayCell">&nbsp;</td>';
	}else{
		if(cellClass=='currentDayCell'){
			linkClass='currentDayLink';
		}else if(cellClass=='selectedDayCell'){
			linkClass='selectedDayLink';
		}else{		
			linkClass='calendarLink';
		}
 		cellCode='<td class="calendarDayCell '+cellClass+'"onclick="selectCalendarDate(\''+theCalendar.dateFormName+'\',\''+dateFieldName+'\',\''+cellValue+'\','+showTime+');return false;"><a class="'+linkClass+'" href="#" onclick="selectCalendarDate(\''+theCalendar.dateFormName+'\',\''+dateFieldName+'\',\''+cellValue+'\','+showTime+');return false;">'+cellDayNumber+'</a></td>';
 	}
	return cellCode;
}

function Calendar(selectedDate,dateFieldName,dateFormName,showTime){
	this.dateFieldName=dateFieldName;
	this.dateFormName=dateFormName;
	this.showTime=showTime;
	
	// current selection
	this.Day=createTwoCharacterNumber(selectedDate.getDate());
	this.Month=createTwoCharacterNumber(selectedDate.getMonth()+1);
	this.Year=selectedDate.getFullYear().toString();
	if(showTime){	
		this.Hours=createTwoCharacterNumber(selectedDate.getHours());
		this.Minutes=createTwoCharacterNumber(selectedDate.getMinutes());
		this.Seconds=createTwoCharacterNumber(selectedDate.getSeconds());
	}
	this.TheDate=this.Year+this.Month+this.Day+this.Hours+this.Minutes+this.Seconds;
	
	// previous selection
	this.SelectedDay=this.Day;
	this.SelectedMonth=this.Month;
	this.SelectedYear=this.Year;
	if(showTime){
		this.SelectedHours=this.Hours;
		this.SelectedMinutes=this.Minutes;
		this.SelectedSeconds=this.Seconds;
	}
	this.SelectedDate=this.Year+this.Month+this.Day+this.Hours+this.Minutes+this.Seconds;
}

function incrementYear(amount, dateFieldName){
	theCalendar = self[dateFieldName + 'Calendar'];
	theCalendar.Year = eval(theCalendar.Year) + amount;
}
Calendar.prototype.incrementYear=incrementYear;

function decreaseYear(amount, dateFieldName){
	theCalendar = self[dateFieldName + 'Calendar'];
	theCalendar.Year = eval(theCalendar.Year) - amount;
}
Calendar.prototype.decreaseYear=decreaseYear;
	
function changeMonthSelection(dateFieldName,intMth){
	theCalendar = self[dateFieldName + 'Calendar'];
	theCalendar.Month=intMth;
}
Calendar.prototype.changeMonthSelection=changeMonthSelection;

function getNumberOfDaysInMonth(){ //Get number of days in a month
	var daysInMonth=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (this.isLeapYear()){
		daysInMonth[1]=29;
	}	
	return daysInMonth[this.Month-1];	
}
Calendar.prototype.getNumberOfDaysInMonth=getNumberOfDaysInMonth;

function isLeapYear(){
	if ((this.Year%4)==0){
		if ((this.Year%100==0) && (this.Year%400)!=0){
			return false;
		}else{
			return true;
		}
	}else{
		return false;
	}
}
Calendar.prototype.isLeapYear=isLeapYear;

function selectCalendarDate(dateFormName,dateFieldName,selectedDate,showTime){
	theCalendar = self[dateFieldName + 'Calendar'];
	var theDay = selectedDate.substring(6,8);
	var theMonth = selectedDate.substring(4,6);
	var theYear = selectedDate.substring(0,4);
	if (showTime){
		var amPMField = eval('document.'+dateFormName+'.'+dateFieldName+'AMPM');
		var hoursField = eval('document.'+dateFormName+'.'+dateFieldName+'Hours');
		var minutesField = eval('document.'+dateFormName+'.'+dateFieldName+'Minutes');
		var theAMPM = amPMField.options[amPMField.selectedIndex].value;
		var theHours = hoursField.options[hoursField.selectedIndex].value;
		var theMinutes = minutesField.options[minutesField.selectedIndex].value;
		if(theAMPM=='AM'){
			selectedDateTime=selectedDate+theHours+theMinutes+'00';
		}else{
			selectedDateTime=selectedDate+(eval(theHours)+12)+theMinutes+'00';
		}
	}else{
		selectedDateTime=selectedDate+'000000';
	}
	setTempCalendarDate(dateFieldName,selectedDateTime,true);
	//alert('year: '+theCalendar.Year+'\nmonth: '+theCalendar.Month+'\nday: '+theCalendar.Day+'\nhours: '+theCalendar.Hours+'\nminutes: '+theCalendar.Minutes+'\nDays in month: '+theCalendar.getNumberOfDaysInMonth());
	renderCalendar(dateFieldName);
}
function setCalendarDate(dateFormName,dateFieldName,showTime){
	theCalendar = self[dateFieldName + 'Calendar'];
	var theDay = theCalendar.Day;
	var theMonth = theCalendar.Month;
	var theYear = theCalendar.Year;
	selectedDate = (theCalendar.Year.toString()+theCalendar.Month.toString()+theCalendar.Day.toString()).toString();
	if (showTime){
		var amPMField = eval('document.'+dateFormName+'.'+dateFieldName+'AMPM');
		var hoursField = eval('document.'+dateFormName+'.'+dateFieldName+'Hours');
		var minutesField = eval('document.'+dateFormName+'.'+dateFieldName+'Minutes');
		var theAMPM = amPMField.options[amPMField.selectedIndex].value;
		var theHours = hoursField.options[hoursField.selectedIndex].value;
		var theMinutes = minutesField.options[minutesField.selectedIndex].value;
		if(theAMPM=='AM' && theHours=='00'){
			theHours = 12;
			theHours24 = '00';
		}else if(theAMPM=='PM' && theHours=='00'){
			theHours = 12;
			theHours24 = 12;
		}else if(theAMPM=='PM'){
			theHours24 = eval(theHours) + 12;
		}else{
			theHours24 = theHours;
		}
		setCalendarField(dateFieldName,dateFormName,selectedDate+theHours24+theMinutes+'00');
		//alert('x'+selectedDate+theHours24+theMinutes+'00x');
		if(theAMPM=='AM'){
			calChangeObjectContents('calDisplay_'+dateFieldName,selectedDate.substring(6,8)+'/'+selectedDate.substring(4,6)+'/'+selectedDate.substring(0,4)+' '+theHours+':'+theMinutes+'am');
		}else{
			calChangeObjectContents('calDisplay_'+dateFieldName,selectedDate.substring(6,8)+'/'+selectedDate.substring(4,6)+'/'+selectedDate.substring(0,4)+' '+theHours+':'+theMinutes+'pm');
		}
	}else{
		setCalendarField(dateFieldName,dateFormName,selectedDate+'000000');
		calChangeObjectContents('calDisplay_'+dateFieldName,selectedDate.substring(6,8)+'/'+selectedDate.substring(4,6)+'/'+selectedDate.substring(0,4));
	}
	calSetObjectVisibility('cal_'+dateFieldName,'hidden');
	calChangeObjectContents('cal_'+dateFieldName,'');
	eval(dateFieldName+'IsVisible=false;');
}

function createTwoCharacterNumber(theNumber){
	if(eval(theNumber)<10){
		theNumber='0'+eval(theNumber).toString();
	}
	return theNumber.toString();
}

function setTempCalendarDate(dateFieldName,selectedDate,setInitialDate){
	theCalendar = self[dateFieldName + 'Calendar'];
	theCalendar.Year = selectedDate.substring(0,4);
	theCalendar.Month = selectedDate.substring(4,6);
	theCalendar.Day = selectedDate.substring(6,8);
	theCalendar.Hours = selectedDate.substring(8,10);
	theCalendar.Minutes = selectedDate.substring(10,12);
	theCalendar.Seconds = '00';
	theCalendar.TheDate = selectedDate;
	if(setInitialDate){
		theCalendar.SelectedYear = theCalendar.Year;
		theCalendar.SelectedMonth = theCalendar.Month;
		theCalendar.SelectedDay = theCalendar.Day;
		theCalendar.SelectedHours = theCalendar.Hours;
		theCalendar.SelectedMinutes = theCalendar.Minutes;
		theCalendar.SelectedSeconds = theCalendar.Seconds;
		theCalendar.SelectedDate = theCalendar.TheDate;
	}
}