/*
 * Datepicker
 * @author: Gustavo Solt
 * @date: 09/2006
 */

var day;
var month;
var year;

/*
 * Formats number to two digits.
 *
 * @param int    i       - Number to format.
 * @param string valtype - Type to switch
 */
function formatNum2(i, valtype) {
    f = (i < 10 ? '0' : '') + i;
    if (valtype && valtype != '') {
        switch(valtype) {
            case 'month':
                f = (f > 12 ? 12 : f);
                break;

            case 'day':
                f = (f > 31 ? 31 : f);
                break;

            default:
                f = (f > 59 ? 59 : f);
                break;
        }
    }

    return f;
}

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

/**
 * Initializes calendar window.
 * 
 * @param string field          - Fiel name
 * @param string seq_y          - Position of the Year by the user
 * @param string seq_m          - Position of the Month by the user
 * @param string seq_d          - Position of the Day by the user
 * @param string userSeparator  - User separator
 * @param string monthNames     - Month's names
 * @param string dayNames       - Days's names
 * @param boolean init          - Init or change month/year
 */
function initCalendar(field, seq_y, seq_m, seq_d, userSeparator, monthNames, dayNames, init) {

    // Lang Text
    var month_names = monthNames.split('_');
    var day_names   = dayNames.split('_');

    // Field
    if (document.getElementById) {
        fcnt = document.getElementById(field);
    } else if (document.all) {
        fcnt = document.all[field];
    }

    // Picker
    if (document.getElementById) {
        cnt = document.getElementById("calendar_data_" + field);
    } else if (document.all) {
        cnt = document.all["calendar_data_" + field];
    }

    // Return if the img is clicked the second time
    if (cnt.style.display == 'inline' && init) {
        cnt.style.display = 'none';
        return;
    }

    if (init) {
        /* Called for first time */
        userDate    = fcnt.value;
        var parts   = userDate.split(userSeparator);
        var value   = parts[seq_y]+"-"+parts[seq_m]+"-"+parts[seq_d];
        year        = parseInt(value.substr(0,4),10);
        month       = parseInt(value.substr(5,2),10) - 1;
        day         = parseInt(value.substr(8,2),10);
        if (isNaN(year) || isNaN(month) || isNaN(day) || day == 0) {
            dt      = new Date();
            year    = dt.getFullYear();
            month   = dt.getMonth();
            day     = dt.getDate();
        }
    } else {
        /* Moving in calendar */
        if (month > 11) {
            month = 0;
            year++;
        }
        if (month < 0) {
            month = 11;
            year--;
        }
    }

    // Show picker
    cnt.style.display = 'inline';
    cnt.innerHTML = "";
    str = "";

    // Month select
    str += '<table class="calendarBodyContainer" cellspacing="0" cellpadding="0" border="0">';
    str += '<thead><th>';
    str += '<a href="javascript://" onClick="month--; initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">&laquo;</a> ';
    str += '<select id="'+field+'_select_month" name="monthsel" onchange="month = parseInt(document.getElementById(\''+field+'_select_month\').value); initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">';
    for (i =0; i < 12; i++) {
        if (i == month) selected = ' selected="selected"';
        else selected = '';
        str += '<option value="' + i + '" ' + selected + '>' + month_names[i] + '</option>';
    }
    str += '</select>';
    str += ' <a href="javascript://" onClick="month++; initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">&raquo;</a>';
    str += '</th>';
    str += '</thead>';
    str += '</table>';

    // Show dates
    str += '<table class="calendarBodyContainer" cellspacing="0" cellpadding="0" border="0">';
    str += '<thead>';
    str += '<tr>';
    for (i = 0; i < 7; i++) {
        str += "<th>" + day_names[i] + "</th>";
    }
    str += "</tr>";
    str += '</thead>';

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

    str += '<tbody>';
    str += "<tr>";

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

        dispmonth = 1 + month;

        actVal = "" + formatNum4(year) + '-' + formatNum2(dispmonth, 'month') + '-' + formatNum2(i, 'day');
        if (i == day) {
            style = ' class="selectedItem"';
        } else {
            style = '';
        }
        str += '<td' + style + '><a href="javascript://" onClick="returnDate(\''+actVal+'\',\''+field+'\',\''+seq_y+'\',\''+seq_m+'\',\''+seq_d+'\',\''+userSeparator+'\');">'+i+'</a></td>';
        dayInWeek++;
    }
    for (i = dayInWeek; i < 7; i++) {
        str += "<td>&nbsp;</td>";
    }

    str += "</tr>";
    str += '</tbody>';
    str += '</table>';

    // Year select
    str += '<table class="calendarBodyContainer" cellspacing="0" cellpadding="0" border="0">';
    str += '<thead><th>';
    str += '<a href="javascript://" onClick="year--; initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">&laquo;</a> ';
    str += '<select id="'+field+'_select_year" name="yearsel" onchange="year = parseInt(document.getElementById(\''+field+'_select_year\').value); initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">';
    for (i = year - 50; i < year + 50; i++) {
        if (i == year) selected = ' selected="selected"';
        else selected = '';
        str += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
    }
    str += '</select>';
    str += ' <a href="javascript://" onClick="year++; initCalendar(\''+field+'\', \''+seq_y+'\', \''+seq_m+'\', \''+seq_d+'\', \''+userSeparator+'\', \''+monthNames+'\', \''+dayNames+'\', false);">&raquo;</a>';
    str += '</th></tr>';
    str += '</thead>';
    str += '</table>';

    cnt.innerHTML = str;
}

/**
 * Returns date from calendar in the user format.
 *
 * @param string d              - Date text
 * @param string field          - Field to put the value
 * @param string seq_y          - Position of the Year by the user
 * @param string seq_m          - Position of the Month by the user
 * @param string seq_d          - Position of the Day by the user
 * @param string userSeparator  - User separator
 */
function returnDate(d, field, seq_y, seq_m, seq_d, userSeparator) {
    txt = d;

    // Picker
    if (document.getElementById) {
        cnt = document.getElementById("calendar_data_" + field);
    } else if (document.all) {
        cnt = document.all["calendar_data_" + field];
    }

    // Field
    if (document.getElementById) {
        fcnt = document.getElementById(field);
    } else if (document.all) {
        fcnt = document.all[field];
    }

    // Hide picker
    cnt.style.display = 'none';

    // Convert to user format
    var parts = d.split("-");
    var rel = new Array();
    rel[seq_y] = parts[0];
    rel[seq_m] = parts[1];
    rel[seq_d] = parts[2];
    var userDate = rel.join(userSeparator);

    // Write the value
    fcnt.value = userDate;
}

