	// Retrieve the position of an element within the page
	function positionInfo(object) {

		var p_elm = object;

		this.getElementLeft = getElementLeft;
		
		// Iterates through the parent controls of a control, summing he relative xpos values to 
		// return the total left value of the original control
		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;
	  
		// Returns the width on a form element
		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;
		
		// sums the left and width values to give the relative right position
		function getElementRight(){
			return getElementLeft(p_elm) + getElementWidth(p_elm);
		}

		this.getElementTop = getElementTop;
		
		// iterate through the parent controls to get the actual top of the form element
		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;
		
		// Get the height of the element
		function getElementHeight(){
			var elm;
			if(typeof(p_elm) == "object"){
				elm = p_elm;
			} else {
				elm = document.getElementById(p_elm);
			}
			return parseInt(elm.offsetHeight);
		}

		// Sum the top and height values to get the distance of the bottom from the top of the screen
		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 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.clearDate = clearDate;
		
		function clearDate() {
			dateField.value = '';
			hide();
		}

		this.setDate = setDate;
		
		function setDate(year, month, day) {
			if (dateField) {
				if (month < 10) {month = "0" + month;}
				if (day < 10) {day = "0" + day;}

			var dateString = day+"/"+month+"/"+year;
			dateField.value = dateString;
			hide();
		}
		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();
	}

	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' onmouseleave='hideCalendarControl();'>";
		table = table + "<tr class='header'>";
		table = table + "  <td colspan='2' class='previous'><a href='javascript:changeCalendarControlMonth(-1);'>&lt;</a> <a href='javascript:changeCalendarControlYear(-1);'>&laquo;</a></td>";
		table = table + "  <td colspan='3' class='title'>" + months[currentMonth-1] + "<br>" + currentYear + "</td>";
		table = table + "  <td colspan='2' class='next'><a href='javascript:changeCalendarControlYear(1);'>&raquo;</a> <a href='javascript:changeCalendarControlMonth(1);'>&gt;</a></td>";
		table = table + "</tr>";
		table = table + "<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>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';
					} else if (dayOfWeek == 0 || dayOfWeek == 6) {
						css_class = 'weekend';
					} else {
						css_class = 'weekday';
					}

					table = table + "<td><a class='"+css_class+"' href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+")\">"+dayOfMonth+"</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;'><a href='javascript:clearCalendarControl();'>Clear</a> | <a href='javascript:hideCalendarControl();'>Close</a></td></tr>";
		table = table + "</table>";

		return table;
	}

	this.show = show;
	
	function show(field) {
		can_hide = 0;
		// If the calendar is visible and associated with
		// this field do not do anything.
    
		if (dateField == field) {
			return;
		} else {
			dateField = field;
		}

		// attempt to parse value from text fiel;d into calendar value
		// if failure then just continue
		if(dateField) {
			try {
				var dateString = new String(dateField.value);
				var dateParts = dateString.split("-");
        
				selectedDay = parseInt(dateParts[0],10);
				selectedMonth = parseInt(dateParts[1],10);
				selectedYear = parseInt(dateParts[2],10);
			} catch(e) {}
		}

		if (!(selectedYear && selectedMonth && selectedDay)) {
			selectedMonth = getCurrentMonth();
			selectedDay = getCurrentDay();
			selectedYear = getCurrentYear();
		}

		currentMonth = selectedMonth;
		currentDay = selectedDay;
		currentYear = selectedYear;

		if(document.getElementById){
			calendar = document.getElementById(calendarId);
			calendar.innerHTML = calendarDrawTable(currentYear, currentMonth);
			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");
 
			if (document.all) {
				setElementProperty('display', 'block', 'CalendarControlIFrame');
				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');
			dateField = null;
		}
	}

	this.visible = visible;

	function visible() {
		return dateField
	}

	this.can_hide = can_hide;
		var can_hide = 0;
	}

	var calendarControl = new CalendarControl();

	function showCalendarControl(textField) {
		// textField.onblur = hideCalendarControl;
		calendarControl.show(textField);
	}

	function clearCalendarControl() {
		calendarControl.clearDate();
	}

	function hideCalendarControl() {
		if (calendarControl.visible()) {calendarControl.hide();}
	}

	function setCalendarControlDate(year, month, day) {
		calendarControl.setDate(year, month, day);
	}

	function changeCalendarControlYear(change) {calendarControl.changeYear(change);}

	function changeCalendarControlMonth(change) {calendarControl.changeMonth(change);}

	document.write("<iframe id='CalendarControlIFrame' src='javascript:false;' frameBorder='0' scrolling='no'></iframe>");
	document.write("<div id='CalendarControl'></div>");
