/**
* Filename.......: calendar.js
* Project........: Popup Calendar
* Last Modified..: $Date: 2006/09/15 11:03:39 $
* CVS Revision...: $Revision: 1.11 $
* Copyright......: 2001, 2002 Richard Heyes
*/

/**
* Global variables
*/
	dynCalendar_layers          = new Array();
	dynCalendar_mouseoverStatus = false;
	dynCalendar_mouseX          = 0;
	dynCalendar_mouseY          = 0;

	
	dynCalendar_monthJanuary 	= '';
	dynCalendar_monthFebruary 	= '';
	dynCalendar_monthMarch 		= '';
	dynCalendar_monthApril	 	= '';
	dynCalendar_monthMay	 	= '';
	dynCalendar_monthJune	 	= '';
	dynCalendar_monthJuly	 	= '';
	dynCalendar_monthAugust 	= '';
	dynCalendar_monthSeptember 	= '';
	dynCalendar_monthOctober 	= '';
	dynCalendar_monthNovember 	= '';
	dynCalendar_monthDecember 	= '';

	dynCalendar_getDate 	= '';
	dynCalendar_resetDate 	= '';
	
	dynCalendarFirstWeekday		= 1;
	
	dynCalendarWeekdays			= new Array();

	dynCalendar_Hour 	= '';
	dynCalendar_Minute 	= '';
	
	dynCalendar_travelDay = '';
	
	function setDyncalendarMonths(_dynCalendar_monthJanuary,	_dynCalendar_monthFebruary,	_dynCalendar_monthMarch, _dynCalendar_monthApril, _dynCalendar_monthMay,	_dynCalendar_monthJune,	_dynCalendar_monthJuly,	_dynCalendar_monthAugust, _dynCalendar_monthSeptember,	_dynCalendar_monthOctober,	_dynCalendar_monthNovember, 	_dynCalendar_monthDecember, _dynCalendar_getDate, _dynCalendar_resetDate) {
		
		dynCalendar_monthJanuary 	= _dynCalendar_monthJanuary;
		dynCalendar_monthFebruary 	= _dynCalendar_monthFebruary;
		dynCalendar_monthMarch 		= _dynCalendar_monthMarch;
		dynCalendar_monthApril	 	= _dynCalendar_monthApril;
		dynCalendar_monthMay	 	= _dynCalendar_monthMay;
		dynCalendar_monthJune	 	= _dynCalendar_monthJune;
		dynCalendar_monthJuly	 	= _dynCalendar_monthJuly;
		dynCalendar_monthAugust 	= _dynCalendar_monthAugust;
		dynCalendar_monthSeptember 	= _dynCalendar_monthSeptember;
		dynCalendar_monthOctober 	= _dynCalendar_monthOctober;
		dynCalendar_monthNovember 	= _dynCalendar_monthNovember;
		dynCalendar_monthDecember 	= _dynCalendar_monthDecember;
		dynCalendar_getDate			= _dynCalendar_getDate;
		dynCalendar_resetDate		= _dynCalendar_resetDate;
	}
	
	function setDyncalendarWeekdays(_Sunday, _Monday, _Tuesday, _Wednesday, _Thursday, _Friday, _Saturday) {
		dynCalendarWeekdays[0] = _Sunday;
		dynCalendarWeekdays[1] = _Monday;
		dynCalendarWeekdays[2] = _Tuesday;
		dynCalendarWeekdays[3] = _Wednesday;
		dynCalendarWeekdays[4] = _Thursday;
		dynCalendarWeekdays[5] = _Friday;
		dynCalendarWeekdays[6] = _Saturday;
	}
	
	function setDyncalendarGeneralTexts(_Hour, _Minute, _TravelDay) {
		dynCalendar_Hour 	= _Hour;
		dynCalendar_Minute 	= _Minute;
		dynCalendar_travelDay = _TravelDay;
	}

/**
* The calendar constructor
*
* @access public
* @param string objName      Name of the object that you create
* @param string inputElement Input element (if = '' then it's first element of calendar parent node)
* @param string DoNotWriteHTML     Do not write HTML (HTML code can be retrieved by getHTML method)
* @param string EnableReset   EnalesREsetButton
*/
	function dynCalendar(objName, formElement, DoNotWriteHTML, EnableReset)
	{
		/**
        * Properties
        */
		// Todays date
		this.today          = new Date();
		this.date           = this.today.getDate();
		this.month          = this.today.getMonth();
		this.year           = this.today.getFullYear();

		// Selected values
		this.selectedDay    = -1;
		this.selectedMonth  = -1;
		this.selectedYear   = -1;
		this.selectedHour   = -1;
		this.selectedMinute = -1;
		this.selectedTravelDay = -1;
		
		this.objName        = objName;
		this.formElement	= formElement;

//		this.imagesPath     = arguments[2] ? arguments[2] : 'images/';
		this.imagesPath     = 'images/';
		this.layerID        = arguments[3] ? arguments[3] : 'dynCalendar_layer_' + dynCalendar_layers.length;

		this.offsetX        = -15;
		this.offsetY        = -15;

		this.useMonthCombo  = true;
		this.useYearInput	= false;
		this.useYearCombo   = true;
		this.yearComboRange = 2;

		this.currentMonth   = this.month;
		this.currentYear    = this.year;
		
		this.timeComponent      = false;
		this.dateComponent	    = true;
		this.pastDaysDisabled   = false;
		this.futureDaysDisabled = false;
		this.travelDayComponent = false;
		this.resetEnabled	    = EnableReset;

		this.callFunctionAfterUpdate = false;
		this.customFunctionAfterUpdate = null;
		this.customFunctionAfterUpdateParam = null;
		
		/**
        * Public Methods
        */
		this.show                = dynCalendar_show;
		this.reset               = dynCalendar_reset;
		this.writeHTML           = dynCalendar_writeHTML;
		this.getHTML             = dynCalendar_getHTML;
		this.enableTimeComponent = dynCalendar_enableTimeComponent;
		this.disableDateComponent= dynCalendar_disableDateComponent;
		this.enableCallFunctionAfterUpdate = dynCalendar_enableCallFunctionAfterUpdate;
		this.setAfterUpdateFunction = dynCalendar_setAfterUpdateFunction;		
		this.disablePastDays     = dynCalendar_disablePastDays;
		this.disableFutureDays     = dynCalendar_disableFutureDays;
		this.clickButtonOk		 = dynCalendar_clickButtonOk;
		this.clickButtonCancel	 = dynCalendar_clickButtonCancel;
		this.enableTravelDayComponent = dynCalendar_enableTravelDayComponent;
		this.setYearInput 		 = dynCalendar_setYearInput;

		// Accessor methods
		this.setOffset         = dynCalendar_setOffset;
		this.setOffsetX        = dynCalendar_setOffsetX;
		this.setOffsetY        = dynCalendar_setOffsetY;
		this.setImagesPath     = dynCalendar_setImagesPath;
		this.setMonthCombo     = dynCalendar_setMonthCombo;
		this.setYearCombo      = dynCalendar_setYearCombo;
		this.setCurrentMonth   = dynCalendar_setCurrentMonth;
		this.setCurrentYear    = dynCalendar_setCurrentYear;
		this.setMaxMonth	   = dynCalendar_setMaxMonth;
		this.setYearComboRange = dynCalendar_setYearComboRange;
		this.setMinYear		   = dynCalendar_setMinYear;
		this.setMaxYear		   = dynCalendar_setMaxYear;
		this.setYearComboStyle = dynCalendar_setYearComboStyle;
		this.setObjName	       = dynCalendar_setObjName;

		/**
        * Private methods
        */
		// Layer manipulation
		this._getLayer         = dynCalendar_getLayer;
		this._hideLayer        = dynCalendar_hideLayer;
		this._showLayer        = dynCalendar_showLayer;
		this._setLayerPosition = dynCalendar_setLayerPosition;
		this._setHTML          = dynCalendar_setHTML;

		// Miscellaneous
		this._getDaysInMonth   = dynCalendar_getDaysInMonth;
		this._mouseover        = dynCalendar_mouseover;

		// Date/Time selection
		this._selectDate	   = dynCalendar_selectDate;
		this._selectHour	   = dynCalendar_selectHour;
		this._selectMinute	   = dynCalendar_selectMinute;
		this._selectTravelDay  = dynCalendar_selectTravelDay;
		this._checkSelection   = dynCalendar_checkSelection;
		
		this._modificationMode = false;
		this._buttonPressed	   = false;
		
		this.layerX = 0;
		this.layerY = 0;
		/**
        * Constructor type code
        */
		dynCalendar_layers[dynCalendar_layers.length] = this;
		if (!DoNotWriteHTML)
			this.writeHTML();
	}

	function dynCalendar_enableTimeComponent() {
		this.timeComponent = true;
	}

	function dynCalendar_enableTravelDayComponent() {
		this.travelDayComponent = true;
	}
	
	function dynCalendar_setYearInput() {
		this.useYearInput = true;
		this.useYearCombo = false;
	}
	
	function dynCalendar_disableDateComponent() {
		this.dateComponent = false;
	}
	
	function dynCalendar_enableCallFunctionAfterUpdate() {
		this.callFunctionAfterUpdate = true;
	}
	
	function dynCalendar_setAfterUpdateFunction(func, param) {
		this.customFunctionAfterUpdate = func;
		this.customFunctionAfterUpdateParam = param;
	}
	
	function dynCalendar_disablePastDays() {
		this.pastDaysDisabled = true;
	}
	
	function dynCalendar_disableFutureDays() {
		this.futureDaysDisabled = true;
	}
	
	function dynCalendar_clickButtonOk() {
		this._buttonPressed = true;
		this._checkSelection();
	}

	function dynCalendar_clickButtonCancel() {
//		this._buttonPressed = true;
//		this._checkSelection();
		CalendarHint.hide();
	}
	
	function dynCalendar_checkSelection() {
		if ((!this.dateComponent || (this.selectedDay > 0 && this.selectedMonth > 0 && this.selectedYear > 0)) && (!this.timeComponent || (this.selectedHour >=0 && this.selectedMinute >= 0)) && (!this.travelDayComponent || (this.selectedHour >=0 && this.selectedMinute >= 0 && this.selectedTravelDay >= 0))) {

			newValue = '';
			if (this.pastDaysDisabled && ((this.selectedDay < this.date && this.selectedMonth == (this.month+1) && this.selectedYear == this.year) || (this.selectedMonth < (this.month+1) && this.selectedYear == this.year) || (this.selectedYear < this.year))) {
				newValue = '';
			}
			else {
					if (this.dateComponent) {
						if (this.dateFormat == 'MM-DD-YYYY')
							newValue = (this.selectedMonth<10 ? '0' : '') + this.selectedMonth + '-' + (this.selectedDay<10 ? '0' : '') + this.selectedDay + '-' + this.selectedYear;
						else if (this.dateFormat == 'YYYY-MM-DD')
							newValue = this.selectedYear + '-' + (this.selectedMonth<10 ? '0' : '') + this.selectedMonth + '-' + (this.selectedDay<10 ? '0' : '') + this.selectedDay;
						else
							newValue = (this.selectedDay<10 ? '0' : '') + this.selectedDay + '-' + (this.selectedMonth<10 ? '0' : '') + this.selectedMonth + '-' + this.selectedYear;
					}
					if (this.timeComponent && this.dateComponent)
						newValue += ' ';
					if (this.timeComponent)
						newValue += (this.selectedHour<10 ? '0' : '') + this.selectedHour + ':' + (this.selectedMinute<10 ? '0' : '') + this.selectedMinute;
					if (this.travelDayComponent)
						newValue += ' D:' + this.selectedTravelDay;
			}
		
			if (!this._modificationMode || this._buttonPressed || !this.timeComponent) {
				this.formElement.value = newValue;
				CalendarHint.hide();
				if (this.callFunctionAfterUpdate) {
					if (this.customFunctionAfterUpdate != null) {
						this.customFunctionAfterUpdate(this.customFunctionAfterUpdateParam);
					}
					else
						calendarUpdated();
				}
			}
	//		this._hideLayer();
		}		
	}
	
	function dynCalendar_selectDate(day, month, year) {
		if (this.selectedDay >= 0 && (this.selectedMonth-1) == this.currentMonth && this.selectedYear == this.currentYear)
			document.getElementById(this.objName+'_day_'+this.selectedDay).className='dynCalendar_day';
			
		this.selectedDay    = day;
		this.selectedMonth  = month;
		this.selectedYear   = year;
		
		if (this.selectedDay >= 0 && (this.selectedMonth-1) == this.currentMonth && this.selectedYear == this.currentYear)
			document.getElementById(this.objName+'_day_'+day).className='dynCalendar_day_selected';
		this._checkSelection();
	}
	
	function dynCalendar_selectHour(hour) {
		if (this.selectedHour >= 0)
			document.getElementById(this.objName+'_hour_'+this.selectedHour).className='dynCalendar_day';
		
		this.selectedHour = hour;
		document.getElementById(this.objName+'_hour_'+hour).className='dynCalendar_day_selected';
		this._checkSelection();
	}

	function dynCalendar_selectTravelDay(travelDay) {
		if (this.selectedTravelDay >= 0)
			document.getElementById(this.objName+'_travelDay_'+this.selectedTravelDay).className='dynCalendar_day';
		
		this.selectedTravelDay = travelDay;
		document.getElementById(this.objName+'_travelDay_'+travelDay).className='dynCalendar_day_selected';
		this._checkSelection();
	}
	
	function dynCalendar_selectMinute(minute) {
		if (this.selectedMinute >= 0)
			document.getElementById(this.objName+'_minute_'+this.selectedMinute).className='dynCalendar_day';
			
		this.selectedMinute = minute;
		document.getElementById(this.objName+'_minute_'+minute).className='dynCalendar_day_selected';
		this._checkSelection();
	}

    function changeKeyCode(code) {
    	if (code >= 96 && code <= 105)
    		return code-48;
    	return code;
    }

/**
* Shows the calendar, or updates the layer if
* already visible.
*
* @access public
* @param integer month Optional month number (0-11)
* @param integer year  Optional year (YYYY format)
*/
	function dynCalendar_show()
	{
		// Variable declarations to prevent globalisation
		var month, year, monthnames, numdays, thisMonth, firstOfMonth;
		var ret, row, i, cssClass, linkHTML, previousMonth, previousYear;
		var nextMonth, nextYear, prevImgHTML, prevLinkHTML, nextImgHTML, nextLinkHTML;
		var monthComboOptions, monthCombo, yearComboOptions, yearCombo, html;
		var travelDay;

		this._buttonPressed	= false;
		
		if (this.formElement == '')
			this.formElement = document.getElementById('CalendarHolder_' + this.objName).parentNode.childNodes[0];

		if (arguments[0] == null && arguments[1] == null && this.formElement.value != '') {
			var arr_date_time = this.formElement.value.split(' ');

			if (this.dateComponent) {
				var arr_date = arr_date_time[0].split('-');
				
				if (this.dateFormat == 'MM-DD-YYYY') {
					this.selectedDay = parseInt(arr_date[1]);
					this.currentMonth = this.selectedMonth = parseInt(arr_date[0]);
					this.currentYear = this.selectedYear = parseInt(arr_date[2]);
				}
				else if (this.dateFormat == 'YYYY-MM-DD') {
					this.selectedDay = parseInt(arr_date[2]);
					this.currentMonth = this.selectedMonth = parseInt(arr_date[1]);
					this.currentYear = this.selectedYear = parseInt(arr_date[0]);
				}
				else {
					this.selectedDay = arr_date[0];
					this.currentMonth = this.selectedMonth = arr_date[1];
					this.currentYear = this.selectedYear = arr_date[2];
				}
	
				this.selectedDay--;
				this.selectedDay++;
				this.selectedMonth--;
				this.selectedMonth++;
				this.selectedYear--;
				this.selectedYear++;
				
				this.currentMonth--;
			}
			
			if (this.timeComponent) {
				var arr_time;
				if (this.dateComponent)
					arr_time = arr_date_time[1].split(':');
				else
					arr_time = arr_date_time[0].split(':');
				this.selectedHour = arr_time[0];				
				this.selectedMinute = arr_time[1];
				this.selectedHour--;
				this.selectedHour++;
				
				this.selectedMinute--;
				this.selectedMinute++;
				
				if (this.selectedMinute%5 != 0) {
					if (this.selectedMinute%5 < 3)
						this.selectedMinute -= this.selectedMinute%5;
					else
						this.selectedMinute += 5-this.selectedMinute%5;
					
				}

			}
			
			if(this.travelDayComponent) {
				arr_travelDay = arr_date_time[1].split(':')
				this.selectedTravelDay = arr_travelDay[1];
//				alert(this.selectedTravelDay);
//				alert(this.currentTravelDay);				
			}
			
			this.layerX = (dynCalendar_mouseX + this.offsetX);
			this.layerY = (dynCalendar_mouseY + this.offsetY);
			
			this._modificationMode = true;
		}
		else if  (arguments[0] == null && arguments[1] == null) {
			this.selectedDay = -1;
			this.selectedHour = -1;
			this.selectedMinute = -1;
			this.selectedTravelDay = -1;
			
			this.layerX = (dynCalendar_mouseX + this.offsetX);
			this.layerY = (dynCalendar_mouseY + this.offsetY);
			
			this._modificationMode = false;
		}
		
		this.currentMonth = month = arguments[0] != null ? arguments[0] : this.currentMonth;
		this.currentYear  = year  = arguments[1] != null ? arguments[1] : this.currentYear;

		monthnames = new Array(dynCalendar_monthJanuary, dynCalendar_monthFebruary, dynCalendar_monthMarch, dynCalendar_monthApril, dynCalendar_monthMay, dynCalendar_monthJune, dynCalendar_monthJuly, dynCalendar_monthAugust, dynCalendar_monthSeptember, dynCalendar_monthOctober, dynCalendar_monthNovember, dynCalendar_monthDecember);
	
		numdays    = this._getDaysInMonth(month, year);

		thisMonth    = new Date(year, month, 1);
		firstOfMonth = thisMonth.getDay();
		
		// First few blanks up to first day
		ret = new Array(new Array());
		
		for(i=0; i<7; i++){
			cur = (dynCalendarFirstWeekday+i)%7;
			if (cur != firstOfMonth)
				ret[0][ret[0].length] = '<td></td>';
			else
				break;
		}

		html = '<div class="dynCalendar">';
		if (this.travelDayComponent) {
			html += '<table border="0" width=220px><tr><td colspan=6 class="dynCalendar_dayname">' + dynCalendar_travelDay + '</td></tr><tr>';
	
			for (i=1; i<6; i++) {
				cssClass = (i == this.selectedTravelDay) ? 'dynCalendar_day_selected' : 'dynCalendar_day';
				html += '<td class="' + cssClass + '" align=center id="' + this.objName + '_travelDay_' + i + '" onClick="' + this.objName + '._selectTravelDay(' + i + ');" onMouseOver="if ('+this.objName+'.selectedTravelDay!='+i+') this.className=\'' + cssClass + '_over\';" onMouseOut="if ('+this.objName+'.selectedTravelDay!='+i+') this.className=\'' + cssClass + '\';">' + i + '</td>';
			}
			html += '</tr></table>';	
		}	
		if (this.dateComponent) {
			// Main body of calendar
			row = 0;
			i   = 1;
			while(i <= numdays){
				if(ret[row].length == 7){
					ret[++row] = new Array();
				}
	
				/**
	            * Generate this cells' HTML
	            */
				cssClass = (i == this.selectedDay && month+1 == this.selectedMonth && year == this.selectedYear) ? 'dynCalendar_day_selected' : 'dynCalendar_day';
				if (this.pastDaysDisabled && ((i < this.date && month == this.month && year == this.year) || (month < this.month && year == this.year) || (year < this.year))) {
					onClickText = '';
					onMouseOverText = '';
					onMouseOutText = '';
					cssClass = 'dynCalendar_day_disabled';
				}
				else {
					onClickText = this.objName + '._selectDate(' + i + ', ' + (Number(month) + 1) + ', ' + year + ');';
					onMouseOverText = 'if ('+this.objName+'.selectedDay!='+i+' || '+this.objName+'.selectedMonth!='+(month+1)+' || '+this.objName+'.selectedYear!='+year+') this.className=\'' + cssClass + '_over\';';
					onMouseOutText = 'if ('+this.objName+'.selectedDay!='+i+' || '+this.objName+'.selectedMonth!='+(month+1)+' || '+this.objName+'.selectedYear!='+year+') this.className=\'' + cssClass + '\';';
				}
				
				if (this.futureDaysDisabled && ((i > this.date && month == this.month && year == this.year) || (month > this.month && year == this.year) || (year > this.year))) {
					onClickText = '';
					onMouseOverText = '';
					onMouseOutText = '';
					cssClass = 'dynCalendar_day_disabled';
				}
				else {
					onClickText = this.objName + '._selectDate(' + i + ', ' + (Number(month) + 1) + ', ' + year + ');';
					onMouseOverText = 'if ('+this.objName+'.selectedDay!='+i+' || '+this.objName+'.selectedMonth!='+(month+1)+' || '+this.objName+'.selectedYear!='+year+') this.className=\'' + cssClass + '_over\';';
					onMouseOutText = 'if ('+this.objName+'.selectedDay!='+i+' || '+this.objName+'.selectedMonth!='+(month+1)+' || '+this.objName+'.selectedYear!='+year+') this.className=\'' + cssClass + '\';';
				}
				
				if (i == this.date && month == this.month && year == this.year)
					ret[row][ret[row].length] = '<td align="center" class="' + cssClass + '" id="' + this.objName + '_day_' + (i) + '" onClick="' + onClickText + '" onMouseOver="' + onMouseOverText + '" onMouseOut="' + onMouseOutText + '"><font color="red"><b>' + (i++) + '</b></font></td>';
				else
					ret[row][ret[row].length] = '<td align="center" class="' + cssClass + '" id="' + this.objName + '_day_' + (i) + '" onClick="' + onClickText + '" onMouseOver="' + onMouseOverText + '" onMouseOut="' + onMouseOutText + '">' + (i++) + '</td>';
			}
			// Format the HTML
			for(i=0; i<ret.length; i++){
				ret[i] = ret[i].join('\n') + '\n';
			}
	
			previousYear  = thisMonth.getFullYear();
			previousMonth = thisMonth.getMonth() - 1;
			if(previousMonth < 0){
				previousMonth = 11;
				previousYear--;
			}
			
			nextYear  = thisMonth.getFullYear();
			nextMonth = thisMonth.getMonth() + 1;
			if(nextMonth > 11){
				nextMonth = 0;
				nextYear++;
			}
	
			prevImgHTML  = '<img src="' + this.imagesPath + '/dyncalendar_prev.gif" alt="<<" border="0" />';
			prevLinkHTML = '<a href="javascript: ' + this.objName + '.show(' + previousMonth + ', ' + previousYear + ')">' + prevImgHTML + '</a>';
			nextImgHTML  = '<img src="' + this.imagesPath + '/dyncalendar_next.gif" alt=">>" border="0" />';
			nextLinkHTML = '<a href="javascript: ' + this.objName + '.show(' + nextMonth + ', ' + nextYear + ')">' + nextImgHTML + '</a>';
	
			/**
	        * Build month combo
	        */
			if (this.useMonthCombo) {
				monthComboOptions = '';
				maxm = 12;
				for (i=0; i<maxm; i++) {
					selected = (i == thisMonth.getMonth() ? 'selected="selected"' : '');
					monthComboOptions += '<option value="' + i + '" ' + selected + '>' + monthnames[i] + '</option>';
				}
				monthCombo = '<select name="months" onchange="' + this.objName + '.show(this.options[this.selectedIndex].value, ' + this.objName + '.currentYear)">' + monthComboOptions + '</select>';
			} else {
				monthCombo = monthnames[thisMonth.getMonth()];
			}
			
			/**
	        * Build year combo
	        */
			if (this.useYearCombo) {
				yearComboOptions = '';
//				if (this.minYear > 0)
//					this.yearComboRange = this.today.getFullYear() - this.minYear;
				if (this.maxYear > 0) {
					tempMaxYear = thisMonth.getFullYear() + this.yearComboRange;
					if (this.maxYear < tempMaxYear) {
						if (this.maxYear > thisMonth.getFullYear())
							tempMaxYear = this.maxYear;
						else
							tempMaxYear = thisMonth.getFullYear();
						
					}

					for (i = thisMonth.getFullYear() - this.yearComboRange; i <= (tempMaxYear); i++) {
						selected = (i == thisMonth.getFullYear() ? 'selected="selected"' : '');
						yearComboOptions += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
					}
				}
				else {
					for (i = thisMonth.getFullYear() - this.yearComboRange; i <= (thisMonth.getFullYear() + 5); i++) {
						selected = (i == thisMonth.getFullYear() ? 'selected="selected"' : '');
						yearComboOptions += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
					}
				}

				yearCombo = '<select style="border: 1px groove;"';
				if (this.yearComboRange > 5 && this.yearComboStyle == 0)
					yearCombo += ' size=2 ';
				yearCombo += ' name="years" onchange="' + this.objName + '.show(' + this.objName + '.currentMonth, this.options[this.selectedIndex].value)">' + yearComboOptions + '</select>';
			}
			else if (this.useYearInput) {
				yearCombo = '<input onKeyUp="if (window.event.keyCode >= 65 && isNaN(parseInt(String.fromCharCode(changeKeyCode(window.event.keyCode))))) this.value = this.value.substring(0, this.value.length - 1); this.value = this.value.replace(\' \', \'\'); if(this.value.length == 4)' + this.objName + '.show(' + this.objName + '.currentMonth, this.value);" size=1 type=text name=years value=' + thisMonth.getFullYear() + '>';
				//yearCombo = '<input onKeyUp="alert(this.value + \' \' + parseInt(this.value )); this.value = parseInt(this.value); if(this.value.length == 4)' + this.objName + '.show(' + this.objName + '.currentMonth, this.value);" size=1 type=text name=years value=' + thisMonth.getFullYear() + '>';
			}
			else {
				yearCombo = thisMonth.getFullYear();
			}
	
			html += '<table border="0" width=220px height=220px>';
			html += '<tr><td class="dynCalendar_header">' + prevLinkHTML + '</td><td colspan="5" align="center" class="dynCalendar_header">' + monthCombo + ' ' + yearCombo + '</td><td align="right" class="dynCalendar_header">' + nextLinkHTML + '</td></tr>';
			html += '<tr>';
			for (i=0; i<7; i++) 
				html += '<td class="dynCalendar_dayname" width=25>' + dynCalendarWeekdays[(dynCalendarFirstWeekday+i)%7] + '</td>';
			html += '<tr>' + ret.join('</tr>\n<tr>') + '</tr>';
			if (ret.length == 5)
				html += "<tr><td colspan=7><img src=\"images/spacer.gif\" width=10 height=20></td></tr>";
	
			html += '</table><br>';
		}
		if (this.timeComponent) {
			html += '<table border="0" width=220px><tr><td colspan=6 class="dynCalendar_dayname">' + dynCalendar_Hour + '</td></tr><tr>';
	
			for (i=0; i<24; i++) {
				if (i % 6 == 0)
					html += '<tr>';
				cssClass = (i == this.selectedHour) ? 'dynCalendar_day_selected' : 'dynCalendar_day';
				html += '<td class="' + cssClass + '" align=center id="' + this.objName + '_hour_' + i + '" onClick="' + this.objName + '._selectHour(' + i + ');" onMouseOver="if ('+this.objName+'.selectedHour!='+i+') this.className=\'' + cssClass + '_over\';" onMouseOut="if ('+this.objName+'.selectedHour!='+i+') this.className=\'' + cssClass + '\';">' + i + '</td>';
				if ((i + 1) % 6 == 0) {
					html += '</tr>';
				}
			}
			html += '</table>';
			
			html += '<br><table border="0" width=220px><tr><td colspan=6 class="dynCalendar_dayname">' + dynCalendar_Minute + '</td></tr><tr>';
			for (i=0; i<12; i++) {
				if (i % 6 == 0)
					html += '<tr>';
				cssClass = (i*5 == this.selectedMinute) ? 'dynCalendar_day_selected' : 'dynCalendar_day';
				html += '<td class="' + cssClass + '" align=center id="' + this.objName + '_minute_' + (i*5) + '" onClick="' + this.objName + '._selectMinute(' + (i*5) + ');" onMouseOver="if ('+this.objName+'.selectedMinute!='+(i*5)+') this.className=\'' + cssClass + '_over\';" onMouseOut="if ('+this.objName+'.selectedMinute!='+(i*5)+') this.className=\'' + cssClass + '\';">' + (i*5) + '</td>';
				if ((i + 1) % 6 == 0) {
					html += '</tr>';
				}
			}
			html += '</table><br>';
		}
		
	//	if (this._modificationMode)
		if (this.timeComponent)
			html += '<div align=center><img src="images/ok16_0.png" onMouseOver="this.src=\'images/ok16_1.png\'" onMouseOut="this.src=\'images/ok16_0.png\'" onClick="' + this.objName + '.clickButtonOk();">&nbsp;<img src="images/cancel16_0.png" onMouseOver="this.src=\'images/cancel16_1.png\'" onMouseOut="this.src=\'images/cancel16_0.png\'" onClick="' + this.objName + '.clickButtonCancel();"><br></div>';
		html += '</div>';



//		this._setHTML(html);
CalendarHint.recreate(0, html);

		if (!arguments[0] && !arguments[1]) {
//			this._showLayer();
//			this._setLayerPosition();
			CalendarHint.showXY(0, this.layerX, this.layerY);
		}
	}

	function dynCalendar_reset() {
		this.formElement.value = '';
	}

/**
* Writes HTML to document for layer
*
* @access public
*/
	function dynCalendar_writeHTML()
	{
		if (is_ie5up || is_nav6up || is_gecko) {
			document.write('<span id="CalendarHolder_' + this.objName + '"></span><script>createIcon(\'calendar16\', \'' + dynCalendar_getDate + '\', \'\', \'javascript: ' + this.objName + '.show()\');</script> ');
			if (this.resetEnabled)
				document.write('<script>createIcon(\'cancel16\', \'' + dynCalendar_resetDate + '\', \'\', \'javascript: ' + this.objName + '.reset()\');</script> ');
//			document.write('<a href="javascript: ' + this.objName + '.show()"><img src="' + this.imagesPath + 'dynCalendar.gif" border="0" width="16" height="16" /></a>');
			document.write('<div style="display:none;" id="' + this.layerID + '" onmouseover="' + this.objName + '._mouseover(true)" onmouseout="' + this.objName + '._mouseover(false);"></div>');
		}
	}

	function dynCalendar_getHTML()
	{
		if (is_ie5up || is_nav6up || is_gecko) {
			result = '<span id="CalendarHolder_' + this.objName + '"></span>' + createIconText('calendar16', dynCalendar_getDate , '', 'javascript: ' + this.objName + '.show()');
			if (this.resetEnabled)
				result = result + createIconText('cancel16', dynCalendar_resetDate , '', 'javascript: ' + this.objName + '.reset()');
			result = result + '<div style="display:none;" id="' + this.layerID + '" onmouseover="' + this.objName + '._mouseover(true)" onmouseout="' + this.objName + '._mouseover(false);"></div>';
			return result;
		}
	}

/**
* Sets the offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Xoffset Number of pixels for vertical
*                        offset from mouse position
* @param integer Yoffset Number of pixels for horizontal
*                        offset from mouse position
*/
	function dynCalendar_setOffset(Xoffset, Yoffset)
	{
		this.setOffsetX(Xoffset);
		this.setOffsetY(Yoffset);
	}

/**
* Sets the X offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Xoffset Number of pixels for horizontal
*                        offset from mouse position
*/
	function dynCalendar_setOffsetX(Xoffset)
	{
		this.offsetX = Xoffset;
	}

/**
* Sets the Y offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Yoffset Number of pixels for vertical
*                        offset from mouse position
*/
	function dynCalendar_setOffsetY(Yoffset)
	{
		this.offsetY = Yoffset;
	}

	function dynCalendar_setObjName(Name) {
		this.objName = Name;
	
	}
/**
* Sets the images path
*
* @access public
* @param string path Path to use for images
*/
	function dynCalendar_setImagesPath(path)
	{
		this.imagesPath = path;
	}

/**
* Turns on/off the month dropdown
*
* @access public
* @param boolean useMonthCombo Whether to use month dropdown or not
*/
	function dynCalendar_setMonthCombo(useMonthCombo)
	{
		this.useMonthCombo = useMonthCombo;
	}

	function dynCalendar_setMaxMonth(maxMonth)
	{
		this.maxMonth = maxMonth;
	}
	
/**
* Turns on/off the year dropdown
*
* @access public
* @param boolean useYearCombo Whether to use year dropdown or not
*/
	function dynCalendar_setYearCombo(useYearCombo)
	{
		this.useYearCombo = useYearCombo;
	}

/**
* Sets the current month being displayed
*
* @access public
* @param boolean month The month to set the current month to
*/
	function dynCalendar_setCurrentMonth(month)
	{
		this.currentMonth = month;
	}

/**
* Sets the current month being displayed
*
* @access public
* @param boolean year The year to set the current year to
*/
	function dynCalendar_setCurrentYear(year)
	{
		this.currentYear = year;
	}
	
/**
* Sets the travel day being displayed
*
* @access public
* @param boolean year The year to set the current year to
*/
	function dynCalendar_setTravelDay(travelDay)
	{
		this.selectedTravelDay = travelDay;
	}
/**
* Sets the range of the year combo. Displays this number of
* years either side of the year being displayed.
*
* @access public
* @param integer range The range to set
*/
	function dynCalendar_setYearComboRange(range)
	{
		this.yearComboRange = range;
	}

	function dynCalendar_setMinYear(minYear)
	{
		this.minYear = minYear;
	}

	function dynCalendar_setMaxYear(maxYear)
	{
		this.maxYear = maxYear;
	}
	
	function dynCalendar_setYearComboStyle(yearComboStyle)
	{
		this.yearComboStyle = yearComboStyle;
	}

/**
* Returns the layer object
*
* @access private
*/
	function dynCalendar_getLayer()
	{
		var layerID = this.layerID;

		if (document.getElementById(layerID)) {

			return document.getElementById(layerID);

		} else if (document.all(layerID)) {
			return document.all(layerID);
		}
	}

/**
* Hides the calendar layer
*
* @access private
*/
	function dynCalendar_hideLayer()
	{
		if (this._getLayer() != null)
			this._getLayer().style.visibility = 'hidden';
	}

/**
* Shows the calendar layer
*
* @access private
*/
	function dynCalendar_showLayer()
	{
		this._getLayer().style.visibility = 'visible';
	}

/**
* Sets the layers position
*
* @access private
*/
	function dynCalendar_setLayerPosition()
	{
		this._getLayer().style.top  = (dynCalendar_mouseY + this.offsetY) + 'px';
		this._getLayer().style.left = (dynCalendar_mouseX + this.offsetX) + 'px';
	}

/**
* Sets the innerHTML attribute of the layer
*
* @access private
*/
	function dynCalendar_setHTML(html)
	{
		this._getLayer().innerHTML = html;
	}

/**
* Returns number of days in the supplied month
*
* @access private
* @param integer month The month to get number of days in
* @param integer year  The year of the month in question
*/
	function dynCalendar_getDaysInMonth(month, year)
	{
		monthdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		if (month != 1) {
			return monthdays[month];
		} else {
			return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28);
		}
	}

/**
* onMouse(Over|Out) event handler
*
* @access private
* @param boolean status Whether the mouse is over the
*                       calendar or not
*/
	function dynCalendar_mouseover(status)
	{
		dynCalendar_mouseoverStatus = status;
		return true;
	}

/**
* onMouseMove event handler
*/
	dynCalendar_oldOnmousemove = document.onmousemove ? document.onmousemove : new Function;

	document.onmousemove = function ()
	{
		if (is_ie5up || is_nav6up || is_gecko) {
			if (arguments[0]) {
				dynCalendar_mouseX = arguments[0].pageX;
				dynCalendar_mouseY = arguments[0].pageY;
			} else {
				dynCalendar_mouseX = event.clientX + document.body.scrollLeft;
				dynCalendar_mouseY = event.clientY + document.body.scrollTop;
				arguments[0] = null;
			}
			
			if (dynCalendar_mouseX < parseInt(CalendarHint.frame.style.left) || dynCalendar_mouseX > (parseInt(CalendarHint.frame.style.left) + parseInt(CalendarHint.frame.style.width)) || dynCalendar_mouseY < parseInt(CalendarHint.frame.style.top) || dynCalendar_mouseY > (parseInt(CalendarHint.frame.style.top) + parseInt(CalendarHint.frame.style.height)))
				CalendarHint.hide();
			dynCalendar_oldOnmousemove();
		}
	}

/**
* Callbacks for document.onclick
*/
	dynCalendar_oldOnclick = document.onclick ? document.onclick : new Function;

	document.onclick = function ()
	{
		if (is_ie5up || is_nav6up || is_gecko) {
			if(!dynCalendar_mouseoverStatus){
				for(i=0; i<dynCalendar_layers.length; ++i){
					dynCalendar_layers[i]._hideLayer();
				}
			}
	
			dynCalendar_oldOnclick(arguments[0] ? arguments[0] : null);
		}
	}
