/**
 * calendar.js
 *
 * Creates a dynamic calendar that can be used to perform differnt actions
 * when a date is selected.
 */

// Global variables
var calendar;               // The calendar object
var currentMonth;           // The current month on the calendar
var currentYear;            // The current year on the calendar

/******************************************************************************
 *  Initialization                                                            *
 ******************************************************************************/

addEvent(window, "load", loadCalendar);

// Initializes the calendar
function loadCalendar()
{
    if (!currentMonth || !currentYear) {
        var today = new Date();
        currentMonth = today.getMonth() + 1;
        currentYear = today.getFullYear();
    }

    if (!calendar)
        calendar = createCalendar();

    var dates = document.getElementById("dates");
    var dateTable = document.getElementById("date_table");

    fillCalendar(calendar, currentMonth, currentYear);
    
    dateTable.parentNode.insertBefore(calendar, dateTable);

    testTable();
}

/******************************************************************************
 *  Primary Functions                                                         *
 ******************************************************************************/

// Returns an empty calendar object
function createCalendar()
{
    // Create the basic elements
    var calendar = document.createElement("div");
    var month = document.createElement("div");
    var table = document.createElement("table");
    var tableHead = document.createElement("thead");
    var tableBody = document.createElement("tbody");

    // Create the header
    var header = document.createElement("tr");
    var days = ["S", "M", "T", "W", "T", "F", "S"];
    for (var i = 0; i < days.length; i++) {
        var field = document.createElement("th");
        setText(field, days[i]);

        header.appendChild(field);
    }

    tableHead.appendChild(header);

    // Create six rows
    for (var i = 1; i <= 6; i++) {
        row = document.createElement("tr");

        // Add seven fields to each row
        for (var j = 0; j < 7; j++) {
            field = document.createElement("td");
            setText(field, "");
            addEvent(field, "click", setDate);
            addEvent(field, "mouseover", function () { this.className = "hover"; } );
            addEvent(field, "mouseout", function () { this.className = ""; } );
            row.appendChild(field);
        }

        tableBody.appendChild(row);
    }

    // Add buttons
    var leftButton = document.createElement("input");
    var rightButton = document.createElement("input");
    leftButton.setAttribute("value", "Back");
    rightButton.setAttribute("value", "Next");
    leftButton.setAttribute("id", "leftbutton");
    rightButton.setAttribute("id", "rightbutton");
    leftButton.setAttribute("type", "button");
    rightButton.setAttribute("type", "button");

    addEvent(leftButton, "click", previousMonth);
    addEvent(rightButton, "click", nextMonth);

    setText(month, "");     // Placeholder text.
    month.appendChild(leftButton);
    month.appendChild(rightButton);

    // Put it all together
    table.appendChild(tableHead);
    table.appendChild(tableBody);

    calendar.appendChild(month);
    calendar.appendChild(table);
    calendar.setAttribute("id", "calendar");

    return calendar;
}

// Fills a calendar object based on the month and year
// Month: [1 = January, 2 = February, etc.]
// Year: [2005, 2006, 2007, etc.]
function fillCalendar(calendar, month, year)
{
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    var months = ["January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"];

    // Adjust for leap year
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
		days[1] = 29;

    // Determine calendar offset
    var start = new Date(year, month - 1, 1);
    var offset = start.getDay();
    var day = 1;

    // Loop through the calendar rows (skipping header, i = 1)
    var rows = calendar.getElementsByTagName("tr");
    for (var i = 1; i <= 6; i++) {

        // Loop through the row fields
        var fields = rows[i].getElementsByTagName("td");
        for (var j = 0; j < 7; j++) {
            if (j < offset || day > days[month - 1]) {
                removeText(fields[j]);
            } else {
                setText(fields[j], day);
                day++;
            }
        }

        offset = 0; // Remove the offset after the first row
    }

    // Set the month
    setText(calendar.firstChild, months[month - 1] + " " + year);
}

/******************************************************************************
 *  Event Handlers                                                            *
 ******************************************************************************/

function previousMonth()
{
    currentMonth--;

    if (currentMonth < 1) {
        currentMonth = 12;
        currentYear--;
    }

    fillCalendar(calendar, currentMonth, currentYear);

    return false;
}

function nextMonth()
{
    currentMonth++;

    if (currentMonth > 12) {
        currentMonth = 1;
        currentYear++;
    }

    fillCalendar(calendar, currentMonth, currentYear);

    return false;
}

function setDate()
{
    if (this.firstChild) {
        var day = this.firstChild.nodeValue;
        var year = currentYear.toString().substring(2);
        var month = currentMonth;

        day = (day < 10) ? "0" + day : day;
        month = (month < 10) ? "0" + month : month;

        var date = month + "/" + day + "/" + year;

        addDate(date);
    }
}
