var lang;
var day;
var month;
var year;
var hour;
var minute;
var second;
var dateField;
var field;
var dateType;

/**
 * Opens calendar div.
 *
 * @param   string      field name
 * @param   string      edit type - date/timestamp
 */
function calendar(fieldname, type, language) {
    field = fieldname;
    dateField = $(field);
    dateType = type;    
    lang = language;
    initCalendar();
    $(field+'-calendar').toggle();
}

/**
 * Formats number to two digits.
 * @param int number to format.
 */
function formatNum2(i, valtype) {    
    if (valtype && valtype != '') {
        switch(valtype) {
            case 'month':
                i = (i > 12 ? 12 : i);
                break;
            case 'day':
                i = (i > 31 ? 31 : i);
                break;
            case 'hour':
                i = (i > 23 ? 23 : i);
                break;
            default:
            case 'second':
            case 'minute':
                i = (i > 59 ? 59 : i);
                break;
        }
    }
    var num = parseInt(i,10);
    num = isNaN(num) ? 0 : num;
    return num.toPaddedString(2);
}

/**
 * Formats number to four digits.
 * @param   int number to format.
 */
function formatNum4(i) {
    return (i < 1000 ? i < 100 ? i < 10 ? '000' : '00' : '0' : '') + i;
}

/**
 * Initializes calendar window.
 */
function initCalendar() {         
    if (dateField.value) {
	value = dateField.value;
	if (dateType == 'datetime' || dateType == 'date') {
	    if (dateType == 'datetime') {
		parts   = value.split(' ');
		value   = parts[0];
		if (parts[1]) {
		    time    = parts[1].split(':');
		    hour    = parseInt(time[0],10);
		    minute  = parseInt(time[1],10);
		    second  = parseInt(time[2],10);
		}
	    }
	    date        = value.split("/");
	    if (lang == 'en') {
		month     = parseInt(date[0],10);
		day       = parseInt(date[1],10) - 1;
	    } else {
		day         = parseInt(date[0],10);
		month       = parseInt(date[1],10) - 1;
	    }
	    year        = parseInt(date[2],10);
	} else {
	    year        = parseInt(value.substr(0,4),10);
	    month       = parseInt(value.substr(4,2),10) - 1;
	    day         = parseInt(value.substr(6,2),10);
	    hour        = parseInt(value.substr(8,2),10);
	    minute      = parseInt(value.substr(10,2),10);
	    second      = parseInt(value.substr(12,2),10);
	}
    }
    if (isNaN(year) || isNaN(month) || isNaN(day) || day == 0) {
	dt      = new Date();
	year    = dt.getFullYear();
	month   = dt.getMonth();
	day     = dt.getDate();
    }
    if (isNaN(hour) || isNaN(minute) || isNaN(second)) {
	dt      = new Date();
	hour    = dt.getHours();
	minute  = dt.getMinutes();
	second  = dt.getSeconds();
    }
    buildCalendar();
}

function buildCalendar() {
    // moving calendar
    if (month > 11) {
	month = 0;
	year++;
    }
    if (month < 0) {
	month = 11;
	year--;
    }
    // end of move
    cnt = $(field+"-calendar-data");
    cnt.innerHTML = "";

    str = "";

    //heading table
    str += '<table class="calendar"><tr><th width="50%">';
    str += '<a href="javascript:month--; buildCalendar();">&laquo;</a> ';
    str += '<select id="'+field+'-select-month" name="monthsel" onchange="javascript:month = parseInt($(\''+field+'-select-month\').value); buildCalendar();">';
    for (i = 0; i < 12; i++) {
        str += '<option value="' + i + '" ' + (i == month? ' selected="selected"' : '') + '>' + _('months',i) + '</option>';
    }
    str += '</select>';
    str += ' <a href="javascript:month++; buildCalendar();">&raquo;</a>';
    str += '</th><th width="50%">';
    str += '<a href="javascript:year--; buildCalendar();">&laquo;</a> ';
    str += '<select id="'+field+'-select-year" name="yearsel" onchange="javascript:year = parseInt($(\''+field+'-select-year\').value); buildCalendar();">';
    for (i = 1999; i <= (new Date()).getFullYear(); i++) {
        str += '<option value="' + i + '" ' + (i == year? ' selected="selected"' : '') + '>' + i + '</option>';
    }
    str += '</select>';
    str += ' <a href="javascript:year++; buildCalendar();">&raquo;</a>';
    str += '</th></tr></table>';

    str += '<table class="calendar"><tr>';
    for (i = 0; i < 7; i++) {
        str += "<th>" + _('days',i) + "</th>";
    }
    str += "</tr>";

    var firstDay = new Date(year, month, 7).getDay();
    var lastDay = new Date(year, month + 1, 0).getDate();

    str += "<tr>";

    dayInWeek = 0;
    for (i = 0; i < firstDay; i++) {
        str += "<td class=\"default\">&nbsp;</td>";
        dayInWeek++;
    }
    for (i = 1; i <= lastDay; i++) {
        if (dayInWeek == 7) {
            str += "</tr><tr>";
            dayInWeek = 0;
        }

        dispmonth = 1 + month;

        if (dateType == 'datetime' || dateType == 'date') {
	    if (lang=='en') actVal = formatNum2(dispmonth, 'month') + "/" + formatNum2(i, 'day') + "/" + formatNum4(year);
	    else actVal = formatNum2(i, 'day') + "/" + formatNum2(dispmonth, 'month') + "/" + formatNum4(year);
        } else {
            actVal = "" + formatNum4(year) + formatNum2(dispmonth, 'month') + formatNum2(i, 'day');
        }
        var style = ' class="week"';
	var over = " onmouseover=\"changeStyle(this,'hover');\"";
	var out = " onmouseout=\"changeStyle(this,'week');\"";
	
	if (dayInWeek==6 || dayInWeek==5) {
	    style =' class="end"'; 
	    out = " onmouseout=\"changeStyle(this,'end');\"";
	}
	if (i == day) { 
	    style =' class="selected"';
	    out = " onmouseout=\"changeStyle(this,'selected');\"";
	}	

	str += "<td" + style + over + out + " onclick=\"returnDate('" + actVal + "');\">" + i + "</td>"
        dayInWeek++;
    }
    for (i = dayInWeek; i < 7; i++) {
        str += "<td>&nbsp;</td>";
    }

    str += "</tr></table>";
    cnt.innerHTML = str;
    
    // Should we handle time also?
    if (dateType != 'date') {
	dt      = new Date();
	hour    = dt.getHours();
	minute  = dt.getMinutes();
	second  = dt.getSeconds();
        str = _('calendar', 'time') + ' : ';
        str += '<form class="clock">';
        str += '<input id="hour" type="text" size="2" maxlength="2" onblur="this.value=formatNum2(this.value, \'hour\')" value="' + formatNum2(hour, 'hour') + '" />';
        str += _('calendar', 'hour')+' ';
        str += '<input id="minute" type="text" size="2" maxlength="2" onblur="this.value=formatNum2(this.value, \'minute\')" value="' + formatNum2(minute, 'minute') + '" />';
	str += _('calendar', 'minute')+' ';
        str += '<input id="second" type="text" size="2" maxlength="2" onblur="this.value=formatNum2(this.value, \'second\')" value="' + formatNum2(second, 'second') + '" />';
	str += _('calendar', 'second')+' ';
        str += '</form>';
        $("clock-data").innerHTML = str;
    }
    
}

/**
 * Returns date from calendar.
 *
 * @param   string     date text
 */
function returnDate(d) {
    txt = d;    
    if (d!='' && dateType != 'date') {
        // need to get time
        h = parseInt($('hour').value,10);
        m = parseInt($('minute').value,10);
        s = parseInt($('second').value,10);
        if (dateType == 'datetime') {
            txt += ' ' + formatNum2(h, 'hour') + ':' + formatNum2(m, 'minute') + ':' + formatNum2(s, 'second');
        } else {
            // timestamp
            txt += formatNum2(h, 'hour') + formatNum2(m, 'minute') + formatNum2(s, 'second');
        }
    }    
    dateField.value = txt;
    $(field+'-calendar').toggle();
}

function changeStyle(object,the_class) {
    object.className=the_class;
}

