//
// Javascript dropdown calendar
// 08/05/2007 by VZ (Adido)
//

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'];
	// 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 + ')" />&nbsp;');
	// 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.jpg" 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.jpg" onclick="Calendar_MinuteUp(' + id + ')"></td></tr>');
	document.write('<tr>');
	document.write('<td><img src="down.jpg" onclick="Calendar_HourDown(' + id + ')"></td>');
	document.write('<td><img src="down.jpg" 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);
        calendar.SelectedDate.setMonth(month);
        while (calendar.SelectedDate.getMonth() != month)
            calendar.SelectedDate.setDate(calendar.SelectedDate.getDate() - 1);
        var obj = document.getElementById('Calendar_Calendar_' + id);
        obj.innerHTML = Calendar_GenerateCalendar(id, calendar.SelectedDate, calendar.VisibleDate);
        var date_array = new Array();
        date_array[0] = calendar.SelectedDate.getDate();
        date_array[1] = calendar.SelectedDate.getMonth();
        date_array[2] = calendar.SelectedDate.getFullYear();
        // 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 (target.value != '')
        {
            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];
        }
    }
}

function Calendar_YearChanged(id, year)
{
    if (window.ADIDO_CALENDARS)
    {
        var calendar = window.ADIDO_CALENDARS[id];
        calendar.VisibleDate.setYear(year);
        calendar.SelectedDate.setYear(year);
        while (calendar.SelectedDate.getMonth() != calendar.VisibleDate.getMonth())
            calendar.SelectedDate.setDate(calendar.SelectedDate.getDate() - 1);
        var obj = document.getElementById('Calendar_Calendar_' + id);
        obj.innerHTML = Calendar_GenerateCalendar(id, calendar.SelectedDate, calendar.VisibleDate);
        var date_array = new Array();
        date_array[0] = calendar.SelectedDate.getDate();
        date_array[1] = calendar.SelectedDate.getMonth();
        date_array[2] = calendar.SelectedDate.getFullYear();
        // 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 (target.value != '')
        {
            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];
        }
    }
}

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';
    }
}

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;
}
