//
// Javascript dropdown calendar
// 08/05/2007 by Vytautas Ziurlis (Adido Solutions Ltd)
//

var Calendar_Months = new Array();
Calendar_Months[0] = 'January';
Calendar_Months[1] = 'February';
Calendar_Months[2] = 'March';
Calendar_Months[3] = 'April';
Calendar_Months[4] = 'May';
Calendar_Months[5] = 'June';
Calendar_Months[6] = 'July';
Calendar_Months[7] = 'August';
Calendar_Months[8] = 'September';
Calendar_Months[9] = 'October';
Calendar_Months[10] = 'November';
Calendar_Months[11] = 'December';

function Calendar(params)
{
    // copy all arguments
	this.ShowHeader = params['ShowHeader'];
	this.ShowDropDowns = params['ShowDropDowns'];
	this.ShowWeekdays = params['ShowWeekdays'];
	this.YearFrom = params['YearFrom'];
	this.YearTo = params['YearTo'];
	this.ImageURL = params['ImageURL'];
	this.TargetControl = params['TargetControl'];
	this.ShowTime = params['ShowTime'];
	this.MinuteInterval = params['MinuteInterval'];
	this.OnChange = params['OnChange'];
	// split date passed and generate datetime object
	var selected_date = params['SelectedDate'];
	var today = new Date();
	if (selected_date == '') selected_date = today.getDate() + '/' + (today.getMonth()+1) + '/' + today.getFullYear();
	var date_array = selected_date.split(' ');
    var date_split = date_array[0].split('/');
    if (params['ShowTime'] == true)
    {
        var time_split = date_array[1].split(':');
        this.SelectedDate = new Date(date_split[2], date_split[1] - 1, date_split[0], time_split[0], time_split[1]);
        this.VisibleDate = new Date(date_split[2], date_split[1] - 1, 1, time_split[0], time_split[1]);
    }
    else
    {
        this.SelectedDate = new Date(date_split[2], date_split[1] - 1, date_split[0]);
        this.VisibleDate = new Date(date_split[2], date_split[1] - 1, 1);
    }
	// register in the global collection	
	if (!window.ADIDO_CALENDARS) window.ADIDO_CALENDARS = [];
	this.id = window.ADIDO_CALENDARS.length;
	window.ADIDO_CALENDARS[this.id] = this;
	// output image
	document.write('<img src="' + this.ImageURL + '" alt="Click here to select date" class="Calendar_Img" onclick="Calendar_Expand(' + this.id + ')" /><br />');
	// start div
	document.write('<div id="Calendar_' + this.id + '" class="Calendar">');
	// output header
	if (this.ShowHeader) Calendar_GenerateHeader(this.id, this.SelectedDate);
	if (this.ShowDropDowns) Calendar_GenerateDropDowns(this.id, this.YearFrom, this.YearTo, this.SelectedDate);
	if (this.ShowWeekdays) Calendar_GenerateWeekdays();
	// generate calendar
	document.write('<div id="Calendar_Calendar_' + this.id + '">' + Calendar_GenerateCalendar(this.id, this.SelectedDate, this.VisibleDate) + '</div>');
	if (this.ShowTime) Calendar_GenerateTime(this.id, this.SelectedDate);
	// finish div
	document.write('</div>');
}

function Calendar_GenerateHeader(id, SelectedDate)
{
	document.write('<div id="Calendar_Header_' + id + '" class="Calendar_Header">'+Calendar_AddLeadZero(SelectedDate.getDate())+' '+Calendar_Months[SelectedDate.getMonth()]+' '+SelectedDate.getFullYear()+'</div>');
}

function Calendar_GenerateDropDowns(id, YearFrom, YearTo, SelectedDate)
{
	// start table
	document.write('<table class="Calendar_DropDownTable" ><tr>');
	// add month dropdown
	document.write('<td align="left"><select id="Calendar_Month_' + id + '" class="Calendar_DropDown" onchange="Calendar_MonthChanged(' + id + ', this.value)">');
	for (i = 0; i < 12; i++)
	{
	    if (i != SelectedDate.getMonth())
	        document.write('<option value="' + i + '">' + Calendar_Months[i] + '</option>');
	    else document.write('<option value="' + i + '" selected="selected">' + Calendar_Months[i] + '</option>');
	}
	document.write('</select>');
	document.write('</td>');
	// add year dropdown
	document.write('<td align="right"><select id="Calendar_Year_' + id + '" class="Calendar_DropDown" onchange="Calendar_YearChanged(' + id + ', this.value)">');
	for (i = YearFrom; i <= YearTo; i++)
	{
	    if (i != SelectedDate.getFullYear())
		    document.write('<option value="' + i + '">' + i + '</option>');
		else document.write('<option value="' + i + '" selected="selected">' + i + '</option>');
	}
	document.write('</select>');
	document.write('</td>');
	// finish table
	document.write('</tr></table>');
}

function Calendar_GenerateWeekdays()
{
    // add weekdays
	document.write('<table class="Calendar_WeekDaysTable"><tr>');
	document.write('<td class="Calendar_WeekDaysCell">Mo</td>');
	document.write('<td class="Calendar_WeekDaysCell">Tu</td>');
	document.write('<td class="Calendar_WeekDaysCell">We</td>');
	document.write('<td class="Calendar_WeekDaysCell">Th</td>');
	document.write('<td class="Calendar_WeekDaysCell">Fr</td>');
	document.write('<td class="Calendar_WeekDaysWeekEndCell">Sa</td>');
	document.write('<td class="Calendar_WeekDaysWeekEndCell">Su</td>');
	document.write('</tr></table>');
}

function Calendar_GenerateCalendar(id, SelectedDate, VisibleDate)
{
    var visibleDate = new Date(VisibleDate.getFullYear(), VisibleDate.getMonth(), VisibleDate.getDate());
    // add calendar
    var result = '<table class="Calendar_Calendar">';
    var Today = new Date();
    var SelectedM = SelectedDate.getMonth();
    var SelectedY = SelectedDate.getFullYear();
    var SelectedD = SelectedDate.getDate();
    var VisibleY = visibleDate.getFullYear();
    var VisibleM = visibleDate.getMonth();
    var cssClass = '';
    // get to first day of selected month
    visibleDate.setDate(1);
    // roll back till first monday
    while (visibleDate.getDay() != 1)
        visibleDate.setDate(visibleDate.getDate() - 1);
    // now output days
    var loop = true;
    while (loop)
    {
        result += '<tr>';
        for (i = 0; i < 5; i++)
        {
            if (VisibleM == visibleDate.getMonth())
            {
                if (SelectedY == visibleDate.getFullYear() && SelectedM == visibleDate.getMonth() && SelectedD == visibleDate.getDate())
                    cssClass = 'Calendar_CalendarSelectedCell';
                else cssClass = 'Calendar_CalendarCell';
            }
            else cssClass = 'Calendar_CalendarOtherMonthCell';
            if (Today.getFullYear() == visibleDate.getFullYear() && Today.getMonth() == visibleDate.getMonth() && Today.getDate() == visibleDate.getDate())
                cssClass += ' Calendar_CalendarTodayCell';
            result += '<td class="' + cssClass + '" onclick="Calendar_Click('+id+', \''+visibleDate.getDate()+'/'+visibleDate.getMonth()+'/'+visibleDate.getFullYear()+'\')">' + visibleDate.getDate() + '</td>';
            visibleDate.setDate(visibleDate.getDate() + 1);
        }
        for (i = 0; i < 2; i++)
        {
            if (VisibleM == visibleDate.getMonth())
            {
                if (SelectedY == visibleDate.getFullYear() && SelectedM == visibleDate.getMonth() && SelectedD == visibleDate.getDate())
                    cssClass = 'Calendar_CalendarSelectedWeekEndCell';
                else cssClass = 'Calendar_CalendarWeekEndCell';
            }
            else cssClass = 'Calendar_CalendarOtherMonthWeekEndCell';
            if (Today.getFullYear() == visibleDate.getFullYear() && Today.getMonth() == visibleDate.getMonth() && Today.getDate() == visibleDate.getDate())
                cssClass += ' Calendar_CalendarTodayCell';
            result += '<td class="' + cssClass + '" onclick="Calendar_Click('+id+', \''+visibleDate.getDate()+'/'+visibleDate.getMonth()+'/'+visibleDate.getFullYear()+'\')">' + visibleDate.getDate() + '</td>';
            visibleDate.setDate(visibleDate.getDate() + 1);
        }
        result += '</tr>';
        loop = (visibleDate.getMonth() <= VisibleM && visibleDate.getFullYear() <= VisibleY);
    }
    result += '</table>'
    return result;
}

function Calendar_GenerateTime(id, SelectedDate)
{
    document.write('<div class="Calendar_Time">');
    document.write('<table id="Calendar_Time_' + id + '" class="Calendar_TimeTable"><tr>');
    document.write('<td rowspan="2">Time:&nbsp;</td>');
	document.write('<td rowspan="2"><input type="text" id="Calendar_Hour_' + id + '" maxlength="2" size="1" value="' + Calendar_AddLeadZero(SelectedDate.getHours()) + '" readonly="readonly" /></td>');
	document.write('<td><img src="up.gif" onclick="Calendar_HourUp(' + id + ')"></td>');
	document.write('<td rowspan="2">:</td>');
	document.write('<td rowspan="2"><input type="text" id="Calendar_Minute_' + id + '" maxlength="2" size="1" value="' + Calendar_AddLeadZero(SelectedDate.getMinutes()) + '" readonly="readonly" /></td>');
	document.write('<td><img src="up.gif" onclick="Calendar_MinuteUp(' + id + ')"></td></tr>');
	document.write('<tr>');
	document.write('<td><img src="down.gif" onclick="Calendar_HourDown(' + id + ')"></td>');
	document.write('<td><img src="down.gif" onclick="Calendar_MinuteDown(' + id + ')"></td>');
	document.write('</tr>');
	document.write('</tr></table></div>');
}

function Calendar_Expand(id)
{
    if (window.ADIDO_CALENDARS)
    {
        var obj = document.getElementById('Calendar_' + id);
        if (obj)
        {
            if (obj.style.display == 'block')
                obj.style.display = 'none';
            else
            {
                // hide all calendars except clicked
                for (i = 0; i < window.ADIDO_CALENDARS.length; i++)
                    if (i != id) document.getElementById('Calendar_' + i).style.display = 'none';
                obj.style.display = 'block';
            }
        }
    }
}

function Calendar_MonthChanged(id, month)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        calendar.VisibleDate.setMonth(month);
        var obj = document.getElementById('Calendar_Calendar_' + id);
        obj.innerHTML = Calendar_GenerateCalendar(id, calendar.SelectedDate, calendar.VisibleDate);
    }
}

function Calendar_YearChanged(id, year)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        calendar.VisibleDate.setYear(year);
        var obj = document.getElementById('Calendar_Calendar_' + id);
        obj.innerHTML = Calendar_GenerateCalendar(id, calendar.SelectedDate, calendar.VisibleDate);
    }
}

function Calendar_Click(id, date)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        var date_array = date.split('/');
        // set dates
        if (calendar.ShowTime)
        {
            calendar.SelectedDate = new Date(date_array[2], date_array[1], date_array[0], calendar.SelectedDate.getHours(), calendar.SelectedDate.getMinutes());
            calendar.VisibleDate = new Date(date_array[2], date_array[1], 1);
        }
        else
        {
            calendar.SelectedDate = new Date(date_array[2], date_array[1], date_array[0]);
            calendar.VisibleDate = new Date(date_array[2], date_array[1], 1);
        }
        // set selected month and year
        var obj = document.getElementById('Calendar_Month_' + id);
        obj.value = date_array[1];
        obj = document.getElementById('Calendar_Year_' + id);
        obj.value = date_array[2];
        // generate calendar
        obj = document.getElementById('Calendar_Calendar_' + id);
        obj.innerHTML = Calendar_GenerateCalendar(id, calendar.SelectedDate, calendar.VisibleDate);
        // set header
        if (calendar.ShowHeader)
        {
            obj = document.getElementById('Calendar_Header_' + id);
            obj.innerHTML = Calendar_AddLeadZero(date_array[0]) + ' ' + Calendar_Months[date_array[1]] + ' ' + date_array[2];
        }
        // set control value
        var target = document.getElementById(calendar.TargetControl);
        if (calendar.ShowTime == true)
            target.value = Calendar_AddLeadZero(date_array[0]) + '/' + Calendar_AddLeadZero(parseInt(date_array[1]) + 1) + '/' + date_array[2] + ' ' + Calendar_AddLeadZero(calendar.SelectedDate.getHours()) + ':' + Calendar_AddLeadZero(calendar.SelectedDate.getMinutes());
        else target.value = Calendar_AddLeadZero(date_array[0]) + '/' + Calendar_AddLeadZero(parseInt(date_array[1]) + 1) + '/' + date_array[2];
        // hide calendar
        var obj = document.getElementById('Calendar_' + id);
        obj.style.display = 'none';
        // evaluate onchange event
        if (calendar.OnChange != null)
        {
            eval(calendar.OnChange);
        }
    }
}

function Calendar_HourUp(id)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        if (calendar.SelectedDate.getHours() == 23)
            calendar.SelectedDate.setHours(0);
        else calendar.SelectedDate.setHours(calendar.SelectedDate.getHours() + 1);
        var obj = document.getElementById('Calendar_Hour_' + id);
        obj.value = Calendar_AddLeadZero(calendar.SelectedDate.getHours());
        var target = document.getElementById(calendar.TargetControl);
        target.value = Calendar_GetFormatedDate(calendar.SelectedDate);
    }
}

function Calendar_HourDown(id)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        if (calendar.SelectedDate.getHours() == 0)
            calendar.SelectedDate.setHours(23);
        else calendar.SelectedDate.setHours(calendar.SelectedDate.getHours() - 1);
        var obj = document.getElementById('Calendar_Hour_' + id);
        obj.value = Calendar_AddLeadZero(calendar.SelectedDate.getHours());
        var target = document.getElementById(calendar.TargetControl);
        target.value = Calendar_GetFormatedDate(calendar.SelectedDate);
    }
}

function Calendar_MinuteUp(id)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        calendar.SelectedDate.setMinutes((calendar.SelectedDate.getMinutes() + calendar.MinuteInterval) % 60);
        var obj = document.getElementById('Calendar_Minute_' + id);
        obj.value = Calendar_AddLeadZero(calendar.SelectedDate.getMinutes());
        var target = document.getElementById(calendar.TargetControl);
        target.value = Calendar_GetFormatedDate(calendar.SelectedDate);
    }
}

function Calendar_MinuteDown(id)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        calendar.SelectedDate.setMinutes(calendar.SelectedDate.getMinutes() - calendar.MinuteInterval);
        if (calendar.SelectedDate.getMinutes() < 0)
            calendar.SelectedDate.setMinutes(calendar.SelectedDate.getMinutes() + 60);
        var obj = document.getElementById('Calendar_Minute_' + id);
        obj.value = Calendar_AddLeadZero(calendar.SelectedDate.getMinutes());
        var target = document.getElementById(calendar.TargetControl);
        target.value = Calendar_GetFormatedDate(calendar.SelectedDate);
    }
}

function Calendar_GetFormatedDate(date)
{
    return Calendar_AddLeadZero(date.getDate()) + '/' + Calendar_AddLeadZero(date.getMonth()+1) + '/' + Calendar_AddLeadZero(date.getFullYear()) + ' ' + Calendar_AddLeadZero(date.getHours()) + ':' + Calendar_AddLeadZero(date.getMinutes());
}

function Calendar_AddLeadZero(value)
{
    var str = ''+value;
    if (str.length == 1)
        return '0' + str;
    else return str;
}

// date validation

/**
 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s)
{
	var i;
    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year)
{
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n)
{
	for (var i = 1; i <= n; i++)
	{
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function DateValid(dtStr)
{
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++)
	{
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1)
	{
		//alert("The date format should be : mm/dd/yyyy")
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12)
	{
		//alert("Please enter a valid month")
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month])
	{
		//alert("Please enter a valid day")
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear)
	{
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false)
	{
		//alert("Please enter a valid date")
		return false;
	}
    return true;
}