

// set date format here. format must be a format 
// configured in dateFormatSettings
var C_CNTRL_DFORMAT = 'YYYY-MM-DD';


// Date formatting configuration
//
// description: 
//
// regexp: regular expression used to parse date values into date components
// orders: date component order spec. [<yearPosition>, <monthPosition>, <dayPosition>] for matched groups in regexp
// string: return date string given (year:YYYY, month:MM, day:DD) parameters
//
dateFormatSettings = {
    'YYYY-MM-DD': { 
	'regexp': /^(\d[0-9][0-9][0-9])-(0?[0-9]|[0-9]|10|11|12)-(0?[0-9]|[0-9]|1[0-9]|2[0-9]|30|31)$/,                         
	'orders': [1, 2, 3],
	'string': function(yr, mn, dy) { return yr+'-'+mn+'-'+dy; }
    },
    'MM-DD-YYYY': { 
	'regexp': /^(0?[0-9]|[0-9]|10|11|12)-(0?[0-9]|[0-9]|1[0-9]|2[0-9]|30|31)-(\d[0-9][0-9][0-9])$/,
	'orders': [3, 1, 2],
	'string': function(yr, mn, dy) { return mn+'-'+dy+'-'+yr; }
    }
};


// Returns matched date components from string as [<matchedYear>, <matchedMonth>, <matchedDay>]
//
// @param regexp Regular expression object
// @param val String to match
// @param order Describes positions of date components in regexp match groups [<yrPos>,<mnPos>,<dayPos>], starting at position 1
function parseFDate(regexp, val, order) { 
    var mvals = val.match(regexp);

    if (mvals && order) { 
	var dcomponents = [];
	dcomponents.push(mvals[order[0]]);
	dcomponents.push(mvals[order[1]]);
	dcomponents.push(mvals[order[2]]);
	return dcomponents;
    }
    return [null, null, null];
}

// get date parts from string using current format
//
function parseCurrentFormat(str) { 
    var reg = dateFormatSettings[C_CNTRL_DFORMAT]['regexp'];
    var ord = dateFormatSettings[C_CNTRL_DFORMAT]['orders'];
    return parseFDate(reg, str, ord);
}


// get date components as a string using current format
//
function getCurrentDString(year, month, day) { 
    return dateFormatSettings[C_CNTRL_DFORMAT]['string'](year, month, day);
}




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 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 = getCurrentDString(year, month, day);

	    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'>";
	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;
	}

	if(dateField) {
	    var dateString = new String(dateField.value);
	    var dcomponents = parseCurrentFormat(dateString);

	    selectedYear  = parseInt(dcomponents[0]);
	    selectedMonth = parseInt(dcomponents[1]);
	    selectedDay   = parseInt(dcomponents[2]);
	}

	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>");
