function positionInfo(object) {

	var p_elm = object;

	this.getElementLeft = getElementLeft;

	function getElementLeft() {
		var x = 0;
		var elm;

		if ( typeof (p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}

		while  (elm != null ) {
			x += elm.offsetLeft;
			elm = elm.offsetParent;
		}

		return parseInt(x);
	}

	this.getElementWidth = getElementWidth;

	function getElementWidth() {
		var elm;

		if ( typeof( p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById( p_elm );
		}

		return parseInt( elm.offsetWidth );
	}

	this.getElementRight = getElementRight;

	function getElementRight() {
		return getElementLeft( p_elm ) + getElementWidth( p_elm );
	}

	this.getElementTop = getElementTop;

	function getElementTop() {
		var y = 0;
		var elm;
		
		if( typeof( p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}

		while ( elm != null ) {
			y += elm.offsetTop;
			elm = elm.offsetParent;
		}

		return parseInt(y);
	}

	this.getElementHeight = getElementHeight;

	function getElementHeight() {
		var elm;

		if ( typeof( p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}

		return parseInt(elm.offsetHeight);
	}

	this.getElementBottom = getElementBottom;

	function getElementBottom() {
		return getElementTop( p_elm ) + getElementHeight( p_elm );
	}
}

function CalendarControl() {

	var calendarId    = 'CalendarControl';
	var currentYear   = 0;
	var currentMonth  = 0;
	var currentDay    = 0;
	var selectedYear  = 0;
	var selectedMonth = 0;
	var selectedDay   = 0;
	var todayYear     = 0;
	var todayMonth    = 0;
	var todayDay      = 0;

	var formObject    = 0;
	var pageCode      = '';
	var actionCode    = '';

	var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	var dateField = null;

	function getProperty( p_property ){
		var p_elm = calendarId;
		var elm = null;

		if( typeof (p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById( p_elm );
		}

		if ( elm != null ) {

			if ( elm.style ) {
				elm = elm.style;
				if ( elm[p_property] ) {
					return elm[p_property];
				} else {
					return null;
				}
			} else {
				return null;
			}
		}
	}

	function setElementProperty( p_property, p_value, p_elmId ) {
		var p_elm = p_elmId;
		var elm = null;

		if( typeof (p_elm ) == "object" ) {
			elm = p_elm;
		} else {
			elm = document.getElementById( p_elm );
		}

	    if ( ( elm != null ) && ( elm.style != null ) ) {
			elm = elm.style;
			elm[ p_property ] = p_value;
		}
	}

	function setProperty( p_property, p_value ) {
		setElementProperty( p_property, p_value, calendarId );
	}

	function getDaysInMonth( year, month ) {
		return [31, ( ( ! ( year % 4 ) && ( ( year % 100 ) || ! ( year % 400 ) ) ) ? 29: 28 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month-1];
	}

	function getDayOfWeek( year, month, day ) {
		var date = new Date( year, month-1, day )
		return date.getDay();
	}

	this.setDate = setDate;

	function setDate( year, month, day ) {
		if ( dateField ) {
			if ( month < 10 ) { month = "0" + month; }
			if ( day   < 10 ) { day   = "0" + day;   }

			//var dateString = month + "/" + day + "/" + year;
			var dateString = year + "-" + month + "-" + day;
			dateField.value = dateString;
			
			hide();

			if ( pageCode.length > 0 ) {
				ButtonClickPage( formObject, pageCode, actionCode );
			}
		}
		return;
	}

	this.changeMonth = changeMonth;

	function changeMonth( change ) {
		currentMonth += change;
		currentDay = 0;
		if ( currentMonth > 12 ) {
			currentMonth = 1;
			currentYear++;
		} else if ( currentMonth < 1 ) {
			currentMonth = 12;
			currentYear--;
		}

		calendar = document.getElementById( calendarId );
		calendar.innerHTML = calendarDrawTable();
	}

	this.changeYear = changeYear;

	function changeYear( change ) {
		currentYear += change;
		currentDay = 0;
		calendar = document.getElementById( calendarId );
		calendar.innerHTML = calendarDrawTable();
	}

	function getCurrentYear() {
		var year = new Date().getYear();
		if( year < 1900 ) year += 1900;
		return year;
	}

	function getCurrentMonth() {
		return new Date().getMonth() + 1;
	} 

	function getCurrentDay() {
		return new Date().getDate();
	}

	this.setToToday = setToToday;

	function setToToday() {
		currentYear  = getCurrentYear();
		currentMonth = getCurrentMonth();
		dayOfMonth   = getCurrentDay();
		calendar     = document.getElementById( calendarId );
		calendar.innerHTML = calendarDrawTable();
	}

	this.setToField = setToField;

	function setToField() {
		if ( dateField ) {
			try {
				var dateString = new String( dateField.value );
				var dateParts  = dateString.split( "-" );
        
				currentYear  = parseInt( dateParts[0], 10 );
				currentMonth = parseInt( dateParts[1], 10 );
				dayOfMonth   = parseInt( dateParts[2], 10 );
			} catch(e) {}
		}

		if ( ! ( currentYear && currentMonth && dayOfMonth ) ) {
			currentMonth = getCurrentMonth();
			dayOfMonth   = getCurrentDay();
			currentYear  = getCurrentYear();
		}

		calendar     = document.getElementById( calendarId );
		calendar.innerHTML = calendarDrawTable();
	}

	function calendarDrawTable() {

		var dayOfMonth = 1;
		var validDay = 0;
		var startDayOfWeek = getDayOfWeek( currentYear, currentMonth, dayOfMonth );
		var daysInMonth = getDaysInMonth( currentYear, currentMonth );
		var css_class = null; //CSS class for each day

		var table = "<table cellspacing='0' cellpadding='0' border='0' style='border: 1px solid #fff;'>"
                  +		"<tr style='background-color: #336;'>"
                  +			"<td nowrap colspan='7' style='text-align: center; font-weight: bold; font-size: 12px; color: #fff;'>"
                  +				months[currentMonth-1] + " " + currentYear
                  +			"</td>"
                  +		"</tr>"
                  +		"<tr style='background-color: #336;'>"
                  +			"<td nowrap colspan='7'style='text-align: center; font-weight: bold; font-size: 10px;'>"
                  +				"<a style='color: #fff; text-decoration: none;' href='javascript:changeCalendarControlMonth(-1);'>&laquo; Prev</a>"
                  +             "<span style='padding-left: 80px;'></span>"
                  +				"<a style='color: #fff; text-decoration: none;' href='javascript:changeCalendarControlMonth(1);'>Next &raquo;</a>"
                  +			"</td>"
                  +		"</tr>"
                  +		"<tr>"
                  +			"<td class='empty'>S</th>"
                  +			"<td class='empty'>M</th>"
                  +			"<td class='empty'>T</th>"
                  +			"<td class='empty'>W</th>"
                  +			"<td class='empty'>T</th>"
                  +			"<td class='empty'>F</th>"
                  +			"<td class='empty'>S</th>"
                  + 	"</tr>";

		for( var week=0; week < 6; week++ ) {
			table = table + "<tr>";

			for( var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++ ) {
				if (week == 0 && startDayOfWeek == dayOfWeek ) {
					validDay = 1;
				} else if ( validDay == 1 && dayOfMonth > daysInMonth ) {
					validDay = 0;
				}

				if ( validDay ) {
					if ( dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth ) {
						css_class  = 'current';
						font_color = 'fff';
					} else if ( dayOfMonth == todayDay && currentYear == todayYear && currentMonth == todayMonth ) {
						css_class = 'today';
						font_color = 'fff';
					} else if ( dayOfWeek == 0 || dayOfWeek == 6 ) {
						css_class = 'weekend';
						font_color = '000';
					} else {
						css_class = 'weekday';
						font_color = '000';
					}

					table = table + "<td class='" + css_class + "'>"
                                  +		"<a"
                                  +       " style='color: #" + font_color + "; text-decoration: none;'"
                                  +       " href=\"javascript:setCalendarControlDate(" + currentYear + "," + currentMonth + "," + dayOfMonth + ")\">"
                                  +			( dayOfMonth < 10 ? "&nbsp;  " + dayOfMonth + " &nbsp;" : "&nbsp;" + dayOfMonth + "&nbsp;" )
                                  +		"</a>"
                                  + "</td>";

					dayOfMonth++;

				} else {

					table = table + "<td class='empty'>&nbsp;</td>";

				}
			}
			table = table + "</tr>";
		}

		table = table +		"<tr class='header'>"
                      +			"<th colspan='7' style='padding: 3px; text-align: center;'>"
                      +				"<a style='color: #fff; text-decoration: none;' href='javascript:changeCalendarControlToToday();'>Today</a>"
                      +             "<span style='padding-left: 25px;'></span>"
                      +				"<a href='javascript:hideCalendarControl();'>Close</a>"
                      +             "<span style='padding-left: 25px;'></span>"
                      +				"<a style='color: #fff; text-decoration: none;' href='javascript:changeCalendarControlToField();'>Field</a>"
                      +			"</th>"
                      + 	"</tr>"
                      + "</table>";

		return table;
	}

	this.show = show;

	function show( field, pFormObject, pPageCode, pActionCode ) {
  
		formObject = pFormObject;
		pageCode   = pPageCode;
		actionCode = pActionCode;
		
		// alert( formObject + " - " + pageCode + " - " + actionCode );
		
		// If the calendar is visible and associated with
		// this field do not do anything.
		if ( dateField == field ) {
			return;
		} else {

			if ( dateField ) {
				var tempStr = new String( dateField.value );
				dateField.value = '';
				dateField.value = tempStr;
			}

			dateField = field;
		}

		if ( dateField ) {
			try {
				var dateString = new String( dateField.value );
				var dateParts  = dateString.split( "-" );
        
				selectedYear  = parseInt( dateParts[0], 10 );
				selectedMonth = parseInt( dateParts[1], 10 );
				selectedDay   = parseInt( dateParts[2], 10 );
			} catch(e) {}
		}

		if ( ! ( selectedYear && selectedMonth && selectedDay ) ) {
			selectedMonth = getCurrentMonth();
			selectedDay   = getCurrentDay();
			selectedYear  = getCurrentYear();
		}

		todayYear  = getCurrentYear();
		todayMonth = getCurrentMonth();
		todayDay   = getCurrentDay();

		currentMonth = selectedMonth;
		currentDay   = selectedDay;
		currentYear  = selectedYear;

		if ( document.getElementById ) {

			calendar = document.getElementById( calendarId );
			calendar.innerHTML = calendarDrawTable( currentYear, currentMonth );

			setElementProperty( 'display', 'block', 'CalendarControlIFrame' );
			setProperty( 'display', 'block' );

			var fieldPos    = new positionInfo( dateField );
			var calendarPos = new positionInfo( calendarId );

			var x = fieldPos.getElementLeft();
			var y = fieldPos.getElementBottom();

			setProperty( 'left', x + "px" );
			setProperty( 'top', y + "px" );
			setElementProperty( 'left', x + "px", 'CalendarControlIFrame' );
			setElementProperty( 'top', y + "px", 'CalendarControlIFrame' );
			setElementProperty( 'width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame' );
			setElementProperty( 'height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame' );
		}
	}

	this.hide = hide;

	function hide() {
		if ( dateField ) {
			setProperty( 'display', 'none' );
			setElementProperty( 'display', 'none', 'CalendarControlIFrame' );

			var tempStr = new String( dateField.value );
			dateField.value = '';
			dateField.value = tempStr;

			dateField = null;
		}
	}
}

var calendarControl = new CalendarControl();

function showCalendarControl( textField, pFormObject, pPageCode, pActionCode ) {
	calendarControl.show( textField, pFormObject, pPageCode, pActionCode );
}

function hideCalendarControl() {
	calendarControl.hide();
}

function setCalendarControlDate( year, month, day ) {
	calendarControl.setDate( year, month, day );
}

function changeCalendarControlYear( change ) {
	calendarControl.changeYear( change );
}

function changeCalendarControlMonth( change ) {
	calendarControl.changeMonth( change );
}

function changeCalendarControlToToday() {
	calendarControl.setToToday();
}

function changeCalendarControlToField() {
	calendarControl.setToField();
}

document.write("<iframe id='CalendarControlIFrame' src='javascript:false;' frameBorder='0' scrolling='no'></iframe>");
document.write("<div id='CalendarControl'></div>");

