/**
 * Extended document object with getElementsByClassName function
 *
 * @param string clsName
 * @return array
 */
document.getElementsByClassName = function(clsName){
    var retVal = new Array();
    var elements = document.getElementsByTagName("*");
    for(var i = 0;i < elements.length;i++){
        if(elements[i].className.indexOf(" ") >= 0){
            var classes = elements[i].className.split(" ");
            for(var j = 0;j < classes.length;j++){
                if(classes[j] == clsName)
                    retVal.push(elements[i]);
            }
        }
        else if(elements[i].className == clsName)
            retVal.push(elements[i]);
    }
    return retVal;
}

/**
 * Wforce calendar definition
 */
function WforceCalendar() {}

/**
 * Wforce calendar prototype extended
 */
WforceCalendar.prototype = {

    // Variables
    monthNamesArray: ['January', 'February', 'March', 'April',
                      'May', 'June', 'July', 'August',
                      'September', 'October', 'November', 'December'],
    headerText: '%MM%, %YYYY%', // header text format (%M% - month number, %MM% - month name, %YYYY% - year 4 digit number)
    daysFirstLetters: 'MTWTFSS', // days first letters in day columns
    divClassName: 'calendar_div',
    headerClassName: 'calendar_header',
    dayNamesClassName: 'calendar_day_names',
    daysClassName: 'calendar_days',
    daysBeforeTodayClassName: 'calendar_till_today',
    daysAfterTodayClassName: 'calendar_after_today',
    todayIdName: 'calendar_today',
    nextMonthClassName: 'calendar_next_month',
    previousMonthClassName: 'calendar_previous_month',
    selectedColor: '#FFCC00',
    normalDayColor: '#F8F8F8',
    allowSelectPast: false,

    /**
     * Get calendar code
     *
     * @param integer y    Year
     * @param integer m    Month
     * @param string edit_id    ID of <input id=""> tag in HTML document
     * @param string after_click    JavaScript code to execute after date clicked
     * @param string uniq_str    Unique latin text (if you use more than one calendar in your HTML page)
     * @param string date_format    Date format, for example: Y-m-d
     * @param string select_date    Select day (Y-m-d)
     * @param string parent_id      Id of element containing calendar
     */
    getCalendar: function(y, m, edit_id, after_click, uniq_str, date_format, select_date, parent_id) {

        // Generate days per month (march have 0 days, recalculated later)
        var monthDaysArray = [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

        // Month date object
        var monthDate = new Date(y, m-1, 7); // start not from first, but from 7th day at month, theb right value for monthDate.getDay() will be

        // Recalculate march month days
        monthDaysArray[1] = (((monthDate.getFullYear() % 100 != 0) && (monthDate.getFullYear() % 4 == 0)) || (monthDate.getFullYear() % 400 == 0))?29:28;

        // Today date object
        var todayDate = new Date();

        var scanTodayDate = ((y == todayDate.getFullYear()) && (m == todayDate.getMonth() + 1))?todayDate.getDate():0;

        // Before link
        var year_before = y - (m==1?1:0);
        var month_before = (m==1?12:(m-1));

        // After link
        var year_after = y + (m==12?1:0);
        var month_after = (m==12?1:(m+1));

        var calendarBuffer = '';

        // Strip date from format: YYYY-MM-DD
        if (document.getElementById(uniq_str + '_selected')) {
            select_date = document.getElementById(uniq_str + '_selected').value;
        }
        var select_day = select_date.replace(/^[0-9]{4}\-[0-9]{1,2}\-/, "");
        var select_month = select_date.replace(/[0-9]{4}\-/, "").replace(/\-[0-9]{1,2}/, "");
        var select_year = select_date.replace(/\-[0-9]{1,2}\-[0-9]{1,2}/, "");

        // Generate formatted header text
        var tmpHeadText = this.headerText;
        tmpHeadText = tmpHeadText.replace('%MM%', this.monthNamesArray[m-1]);
        tmpHeadText = tmpHeadText.replace('%M%', m);
        tmpHeadText = tmpHeadText.replace('%YYYY%', y);

      //  return calendarBuffer += '</tr></table></div>';

        calendarBuffer="";
        calendarBuffer += "                                                        <table class=\"calendar\">";
        calendarBuffer += "                                                            <tr>";
        calendarBuffer += "                                                                <td class=\"calendar_top\">";
        calendarBuffer += "                                                                    <div class=\"posrel\">";
        calendarBuffer += "                                                                        <table class=\"wf\">";
        calendarBuffer += "";
        calendarBuffer += "                                                                            <tr>";
        calendarBuffer += "                                                                                <td class=\"calendar_previous_month\">";
        calendarBuffer += '                                                                                    <a href="javascript:void(0)" onclick="document.getElementById(\''+parent_id+'\').innerHTML = WfCalendar.getCalendar(' + year_before + ', ' + month_before + ', \'' + edit_id + '\', \'' + after_click.replace(/\'/g, '\\\'') + '\', \'' + uniq_str + '\', \'' + date_format + '\', \'' + select_date + '\', \'' + parent_id + '\');"><img src="public\/media\/images\/btn\/calendar_back.gif" onmouseover="over(this);" onmouseout="over(this);" alt="" \/><\/a>';
        calendarBuffer += "                                                                                    <img class=\"preload\" src=\"public\/media\/images\/btn\/calendar_back_ov.gif\" alt=\"\" \/>";
        calendarBuffer += "                                                                                <\/td>";
        calendarBuffer += "                                                                                <td class=\"calendar_header\">" + tmpHeadText + "<\/td>";
        calendarBuffer += "                                                                                <td class=\"calendar_next_month\">";
        calendarBuffer += '                                                                                    <a href="javascript:void(0)" onclick="document.getElementById(\''+parent_id+'\').innerHTML = WfCalendar.getCalendar(' + year_after + ', ' + month_after + ', \'' + edit_id + '\', \'' + after_click.replace(/\'/g, '\\\'') + '\', \'' + uniq_str + '\', \'' + date_format + '\', \'' + select_date + '\', \'' + parent_id + '\');"><img src="public\/media\/images\/btn\/calendar_next.gif" onmouseover="over(this);" onmouseout="over(this);" alt="" \/><\/a>';
        calendarBuffer += "";
        calendarBuffer += "                                                                                    <img class=\"preload\" src=\"public\/media\/images\/btn\/calendar_next_ov.gif\" alt=\"\" \/>";
        calendarBuffer += "                                                                                <\/td>";
        calendarBuffer += "                                                                            <\/tr>";
        calendarBuffer += "                                                                        <\/table>";
        calendarBuffer += "                                                                    <\/div>";
        calendarBuffer += "                                                                <\/td>";
        calendarBuffer += "                                                            <\/tr>";
        calendarBuffer += "                                                            <tr>";
        calendarBuffer += "                                                                <td class=\"calendar_mid\">";
        calendarBuffer += "";
        calendarBuffer += "                                                                    <div class=\"calendar_div\">";
        calendarBuffer += "                                                                        <table class=\"wf\">";
        calendarBuffer += "                                                                            <tr>";
        for(i = 0; i < 5; i++) {
            calendarBuffer += "<th>" + this.daysFirstLetters.substr(i, 1) + "</th>";
        }
        for(i = 5; i < 7; i++) {
            calendarBuffer += "<th class=\"weekend\">" + this.daysFirstLetters.substr(i, 1) + "</th>";
        }       
        calendarBuffer += "                                                                            <\/tr>";
        calendarBuffer += "                                                                            <tr>";

        for(i = 1; i <= 42; i++) {

            var dayNow = ((i - monthDate.getDay() >= 0) && (i - monthDate.getDay() <= monthDaysArray[m - 1]))?(i - monthDate.getDay()):'';
            var appendString = "";

            if (scanTodayDate == 0) { // month is befor or after today's month
                if (dayNow) { // right day
                    if ((dayNow == select_day) && (m == select_month) && (y == select_year)) {// this day should be selected
                        calendarBuffer += '<td class="' + uniq_str + '" class="calendar_event" onclick="WfCalendar.clearAll(\'' + uniq_str + '\'); document.getElementById(\'' + edit_id + '\').value = WfCalendar.getFormattedDate(\'' + uniq_str + '\', \'' + date_format + '\', ' + y + ', ' + (m<10?'0'+m:m) + ', ' + (dayNow<10?"0"+dayNow:dayNow) + '); ' + after_click + '"><span onmouseover="over(this);" onmouseout="over(this);">' + dayNow + '<\/span><\/td>';
                    } else {
                        calendarBuffer += '<td class="' + uniq_str + '" onclick="WfCalendar.clearAll(\'' + uniq_str + '\'); document.getElementById(\'' + edit_id + '\').value = WfCalendar.getFormattedDate(\'' + uniq_str + '\', \'' + date_format + '\', ' + y + ', ' + (m<10?'0'+m:m) + ', ' + (dayNow<10?"0"+dayNow:dayNow) + '); ' + after_click + '"><span onmouseover="over(this);" onmouseout="over(this);">' + dayNow + '<\/span><\/td>';
                    }
                } else { // empty space
                    calendarBuffer += "                                                                                <td>&nbsp;<\/td>";
                }
            } else {
                if (dayNow) { // right day

                    if (dayNow > scanTodayDate) { // after today
                        calendarBuffer += '<td class="' + uniq_str + '" onclick="WfCalendar.clearAll(\'' + uniq_str + '\'); document.getElementById(\'' + edit_id + '\').value = WfCalendar.getFormattedDate(\'' + uniq_str + '\', \'' + date_format + '\', ' + y + ', ' + (m<10?'0'+m:m) + ', ' + (dayNow<10?"0"+dayNow:dayNow) + '); ' + after_click + '"><span onmouseover="over(this);" onmouseout="over(this);">' + dayNow + '<\/span><\/td>';
                    } else if (dayNow == scanTodayDate) { // today's date
                        calendarBuffer += '<td id="calendar_today" class="' + uniq_str + '" onclick="WfCalendar.clearAll(\'' + uniq_str + '\'); document.getElementById(\'' + edit_id + '\').value = WfCalendar.getFormattedDate(\'' + uniq_str + '\', \'' + date_format + '\', ' + y + ', ' + (m<10?'0'+m:m) + ', ' + (dayNow<10?"0"+dayNow:dayNow) + '); ' + after_click + '"><span onmouseover="over(this);" onmouseout="over(this);">' + dayNow + '<\/span><\/td>';
                    } else { // before today
                        calendarBuffer += '<td class="' + uniq_str + '" onclick="WfCalendar.clearAll(\'' + uniq_str + '\'); document.getElementById(\'' + edit_id + '\').value = WfCalendar.getFormattedDate(\'' + uniq_str + '\', \'' + date_format + '\', ' + y + ', ' + (m<10?'0'+m:m) + ', ' + (dayNow<10?"0"+dayNow:dayNow) + '); ' + after_click + '"><span onmouseover="over(this);" onmouseout="over(this);">' + dayNow + '<\/span><\/td>';
                   }

                } else { // empty space
                    calendarBuffer += "                                                                                <td>&nbsp;<\/td>";
                }
            }

            if ((i % 7 == 0) && (i < 36)) {
                calendarBuffer += '</tr><tr>';
            }
        }

        calendarBuffer += "                                                                            <\/tr>";
        calendarBuffer += "                                                                        <\/table>";
        calendarBuffer += "                                                                    <\/div>";
        calendarBuffer += "                                                                <\/td>";
        calendarBuffer += "                                                            <\/tr>";
        calendarBuffer += "                                                            <tr>";
        calendarBuffer += "";
        calendarBuffer += "                                                                <td class=\"calendar_bot\"><img src=\"public\/media\/images\/s.gif\" alt=\"\" \/><\/td>";
        calendarBuffer += "                                                            <\/tr>";
        calendarBuffer += "                                                        <\/table>";

      return calendarBuffer;
    },

    /**
     * Clear background color from all calendar
     *
     * @param string uniq_str    Unique latin text (if you use more than one calendar in your HTML page)
     * @return void
     */
    clearAll: function(uniq_str) {
        var all_objects = document.getElementsByClassName(uniq_str);
        for (i = 0; i < all_objects.length; i++) {
            all_objects[i].style.backgroundColor = this.normalDayColor;
        }
    },

    /**
     * Return formatted date
     *
     * @param string uniq_str    Unique latin text (if you use more than one calendar in your HTML page
     * @param string date_format    Date format, for example: Y-m-d
     * @param integer y    Year
     * @param integer m    Month
     * @param integer d    Day
     * @return string
     */
    getFormattedDate: function(uniq_str, date_format, y, m, d) {
        date_format = date_format.replace('Y', y);
        date_format = date_format.replace('m', (m<10?'0'+m:m));
        date_format = date_format.replace('d', (d<10?"0"+d:d));
        if (document.getElementById(uniq_str + '_selected')) {
            document.getElementById(uniq_str + '_selected').value = y + '-' + m + '-' + d;
        }
        return date_format;
    }

}

// Default Wforce calendar object
var WfCalendar = new WforceCalendar();
