﻿var MONTHS = new Array(); MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var WEEKDAYS = new Array(); WEEKDAYS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];

var divDatePickerId = "divDatePicker";  /*Container for ENTIRE CONTROL date picker*/
var divDatePickerCalendarId = "divDatePickerCalendar";  /*Div container for calendar grid*/
var tblDatePickerCalendarId = "tblDatePickerCalendar";  /*Table for calendar grid*/
var divDatePickerYearPickerId = "divDatePickerYearPicker";  /*Container for YEAR selector*/
var tblDatePickerYearPickerId = "tblDatePickerYearPicker";  /*Table for YEAR selector*/
var divDatePickerMonthPickerId = "divDatePickerMonthPicker";  /*Container for MONTH selector*/
var tblDatePickerMonthPickerId = "tblDatePickerMonthPicker";  /*Table for MONTH selector*/
var ancYearSelectorId = "tblDatePickerCalendarYear"; /*Year anchor id*/
var ancMonthSelectorId = "tblDatePickerCalendarMonth"; /*Month anchor id*/
var divDatePickerFooterId = "divDatePickerFooter";  /*Container for selector footer*/
var divDatePickerHeaderId = "divDatePickerHeader"; /*Container for selector header*/

var ImagePath = "images/"; /*Path to where the images are located.*/

function disposeDatePicker() { $("#" + divDatePickerId).children().remove(); $("#" + divDatePickerId).hide(); }
function disposeDatePickerYearPicker() { $("#" + divDatePickerYearPickerId).remove(); }
function disposeDatePickerMonthPicker() { $("#" + divDatePickerMonthPickerId).remove(); }
function LastOfGrid(pvFirstOfMonth, pvLastOfMonth) {
    var nodim = parseInt(NumberOfDayInMonth(GetYearValue(pvFirstOfMonth), GetMonthValue(pvFirstOfMonth)));
    return GetLocalDate(GetYearValue(pvFirstOfMonth), GetMonthValue(pvFirstOfMonth), nodim + (6 - GetDayValue(pvLastOfMonth)), 0, 0);
}
function FirstOfGrid(pvFirstOfMonth) {
    return GetLocalDate(GetYearValue(pvFirstOfMonth), GetMonthValue(pvFirstOfMonth), 1 - GetDayValue(pvFirstOfMonth), 0, 0);
}
function setDateToField(pvInputFieldId, pvValue) { var elem = document.getElementById(pvInputFieldId); if (elem != null) { elem.value = pvValue; } }

function dayClicked(pvDateString, pvTargetId, pvStartControlId, pvEndControlId) {
    setDateToField(pvTargetId, pvDateString);
    validateControls(pvTargetId, pvStartControlId, pvEndControlId);
    $("#"+pvTargetId).trigger("change");
    disposeDatePicker();
}

function validateControls(pvTarget, pvStartControlId, pvEndControlId) {
    var lStartDate = new Date(); lStartDate = GetDateFromInputText(pvStartControlId, null);
    var lEndDate = new Date(); lEndDate = GetDateFromInputText(pvEndControlId, null);

    if (lStartDate == null && lEndDate == null) {
        /*Both invalid*/
        setDateToField(pvStartControlId, "");
        setDateToField(pvEndControlId, "");
    }
    else if (lStartDate == null || lEndDate == null) {
        /*One Invalid*/
        if (lStartDate == null) { setDateToField(pvStartControlId, GetLocalDateString(lEndDate)); }
        if (lEndDate == null) { setDateToField(pvEndControlId, GetLocalDateString(lStartDate)); }
    }
    else {
        if (lStartDate > lEndDate) {
            if (pvTarget == pvStartControlId) {
                setDateToField(pvEndControlId, GetLocalDateString(lStartDate)) /*Start after End, Make End = Start*/
            }
            else {
                setDateToField(pvStartControlId, GetLocalDateString(lEndDate)) /*End before Start, Make Start = End*/
            }
        }
    }

    /*Try to validate any attached time controls*/
    try { validateTimes(pvEndControlId.replace("Date", "Time")); }
    catch (Error) { }

    disposeDatePicker();
}

function initSGrid(pvStartDateControlId, pvEndDateControlId) {
    var lD = new Date();
    var lCTargetDate = GetDateFromInputText(pvStartDateControlId, FirstOfMonth(GetLocalDate(lD.getFullYear(), lD.getMonth(), 1, 0, 0)));
    createGrid(GetLocalDateString(lCTargetDate), pvStartDateControlId, pvStartDateControlId, pvEndDateControlId);
}

function initEGrid(pvEndDateControlId, pvStartDateControlId) {
    var lD = new Date();
    var lCTargetDate = GetDateFromInputText(pvStartDateControlId, FirstOfMonth(GetLocalDate(lD.getFullYear(), lD.getMonth(), 1, 0, 0)));
    var lLinkingStartDate = GetDateFromInputText(pvStartDateControlId, null);

    if (lLinkingStartDate != null) {
        /*If a start date is selected do not show an end date grid prior to this date*/
        lCTargetDate = (lLinkingStartDate > lCTargetDate) ? lLinkingStartDate : lCTargetDate;
    }

    createGrid(GetLocalDateString(lCTargetDate), pvEndDateControlId, pvStartDateControlId, pvEndDateControlId);
}

function createGrid(pvGridDate, pvTargetId, pvStartControlId, pvEndControlId) {
    disposeDatePicker(); disposeDatePickerYearPicker(); disposeDatePickerMonthPicker();

    /*Place the date picker div by the pvTargetId control*/
    var divDatePicker = document.getElementById(divDatePickerId);
    var ctr = jQuery("#" + pvTargetId);
    var ctrpos = ctr.position();
    var ctrposOuterHeight = ctr.outerHeight();
    var ctrposFullOffset = parseInt(ctrpos.top) + parseInt(ctrposOuterHeight);
    divDatePicker.style.top = ctrposFullOffset + "px";
    divDatePicker.style.left = ctrpos.left + "px";

    /*Get dates needed to render grid*/
    var lLinkFromDate = GetDateFromInputText(pvStartControlId, null);
    var lGridDate = GetDate(pvGridDate);
    var lFirstOfMonth = FirstOfMonth(lGridDate);
    var lFirstOfGrid = FirstOfGrid(lFirstOfMonth);
    var lLastOfMonth = LastOfMonth(lGridDate);
    var lLastOfGrid = LastOfGrid(lFirstOfMonth, lLastOfMonth);
    var lNextMonth = NextMonth(lLastOfMonth);
    var lLastMonth = LastMonth(lFirstOfMonth);

    /*Create selector CALENDAR grid elements*/
    var divDatePickerCalendar = document.createElement("div");
    var tblDatePickerCalendar = document.createElement("table");
    var tblDatePickerCalendarBody = document.createElement("tbody");
    tblDatePickerCalendar.setAttribute("id", tblDatePickerCalendarId);
    divDatePickerCalendar.setAttribute("id", divDatePickerCalendarId);

    lRowTitle = document.createElement("tr"); /*Title Row*/
    /*Previous Selector*/
    lCellPreviousMonth = document.createElement("td");
    lCellPreviousMonth.align = "center";
    lCellPreviousMonth.className = "titlebar";
    lAnchorPreviousMonth = createAnchorHelper("", "javascript:createGrid('" + GetLocalDateString(lLastMonth) + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", "<img src=\"" + ImagePath + "datepicker_left.gif\" width=\"10\" height=\"10\" border=\"0\" />", "", "Previous month");
    lCellPreviousMonth.appendChild(lAnchorPreviousMonth);
    lRowTitle.appendChild(lCellPreviousMonth);
    /*Month Year Heading & Selector*/
    lCellMonthYear = document.createElement("td");
    lCellMonthYear.colSpan = 4;
    lCellMonthYear.align = "center";
    lCellMonthYear.className = "titlebar";
    lAnchorMonth = createAnchorHelper(ancMonthSelectorId, "javascript:monthSelector('" + GetLocalDateString(lFirstOfMonth) + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "');", MONTHS[GetMonthValue(lGridDate)], "titlebar", "Jump to month");
    lSpacer = document.createTextNode(" ");
    lAnchorYear = createAnchorHelper(ancYearSelectorId, "javascript:yearSelector('" + GetLocalDateString(lFirstOfMonth) + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "');", GetYearValue(lGridDate), "titlebar", "Jump to year");
    lCellMonthYear.appendChild(lAnchorMonth);
    lCellMonthYear.appendChild(lSpacer);
    lCellMonthYear.appendChild(lAnchorYear);
    lRowTitle.appendChild(lCellMonthYear);
    /*Next Selector*/
    lCellNextMonth = document.createElement("td");
    lCellNextMonth.align = "center";
    lCellNextMonth.className = "titlebar";
    lAnchorNextMonth = createAnchorHelper("", "javascript:createGrid('" + GetLocalDateString(lNextMonth) + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", "<img src=\"" + ImagePath + "datepicker_right.gif\" width=\"10\" height=\"10\" border=\"0\" />", "", "Next month");
    lCellNextMonth.appendChild(lAnchorNextMonth);
    lRowTitle.appendChild(lCellNextMonth);
    /*Close Heading*/
    lCellClose = document.createElement("td");
    lCellClose.colSpan = 1;
    lCellClose.align = "right";
    lCellClose.className = "titlebar";
    lAnchorClose = createAnchorHelper("", "javascript:disposeDatePicker();", "X", "closecalendar", "Close calendar");
    lCellClose.appendChild(lAnchorClose);
    lRowTitle.appendChild(lCellClose);
    tblDatePickerCalendarBody.appendChild(lRowTitle);

    /*Weekday headings*/
    lRowWeekdayHeading = document.createElement("tr"); /*Weekday Headings*/
    for (i = 0; i < WEEKDAYS.length; i++) {
        lCellWeekday = document.createElement("td");
        lCellWeekday.className = "dayheading";
        lCellWeekday.align = "center";
        lTextWeekday = document.createTextNode(WEEKDAYS[i]);
        lCellWeekday.appendChild(lTextWeekday);
        lRowWeekdayHeading.appendChild(lCellWeekday);
    }
    tblDatePickerCalendarBody.appendChild(lRowWeekdayHeading);

    /*Selectable days*/
    var lRowWeekdays = document.createElement("tr"); /*Weekday Rows*/
    while (lFirstOfGrid <= lLastOfGrid) {
        /*These are the dates the event is for*/
        var m = GetMonthValue(lFirstOfGrid);
        var ma = GetMonthAdjustedValue(lFirstOfGrid);
        var d = GetDateValue(lFirstOfGrid);
        var y = GetYearValue(lFirstOfGrid);

        //alert("ma=" + ma + ", m=" + m + ", d=" + d + ", y=" + y);

        /*Create the cell then fill it with the correct text*/
        lCellWeekday = document.createElement("td");
        lCellWeekday.align = "center";

        if (lFirstOfGrid >= lFirstOfMonth && lFirstOfGrid <= lLastOfMonth) {
            var daycontrol;
            if (pvTargetId == pvStartControlId) {
                /*Start date grids have all days linkable.*/
                daycontrol = createAnchorHelper("", "javascript:dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", d, "currentmonth", "");
                daycontrol.setAttribute("onclick", "dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')");
            }
            else {
                if (lLinkFromDate == null) {
                    /*No start date, make all days linkable.*/
                    daycontrol = createAnchorHelper("", "javascript:dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", d, "currentmonth", "");
                    daycontrol.setAttribute("onclick", "dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')");
                }
                else if (lFirstOfGrid >= lLinkFromDate) {
                    /*Make days on or after {lLinkFromDate} linkable.*/
                    daycontrol = createAnchorHelper("", "javascript:dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", d, "currentmonth", "");
                    daycontrol.setAttribute("onclick", "dayClicked('" + ma + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')");
                }
                else {
                    /*Make days before {lLinkFromDate} unlinkable.*/
                    daycontrol = document.createElement("span");
                    daycontrol.innerHTML = d;
                }
            }
            lCellWeekday.appendChild(daycontrol);
        }
        else {
            /*This day is not in the month being being drawn, do not make it linkable*/
            lCellWeekday.className = "othermonth";
        }

        /*Add the cell to the table row*/
        lRowWeekdays.appendChild(lCellWeekday);

        /*Add the row to the table when is saturday*/
        if (GetDayValue(lFirstOfGrid) == 6) {
            tblDatePickerCalendarBody.appendChild(lRowWeekdays);
            lRowWeekdays = document.createElement("tr");
        }

        /*Increment to the next day*/
        lFirstOfGrid = GetLocalDate(y, m, parseInt(d) + 1, 0, 0);
    }

    /*Add all the cells to the table*/
    tblDatePickerCalendar.appendChild(tblDatePickerCalendarBody);
    divDatePickerCalendar.appendChild(tblDatePickerCalendar)
    divDatePicker.appendChild(divDatePickerCalendar);

    /*Create selector FOOTER elements*/
    var divDatePickerFooter = document.createElement("div");
    divDatePickerFooter.setAttribute("id", divDatePickerFooterId);

    /*today link*/
    var lToday = new Date();
    lAnchorToday = createAnchorHelper("", "javascript:createGrid('" + GetLocalDateString(lToday) + "','" + pvTargetId + "','" + pvStartControlId + "','" + pvEndControlId + "')", "Today&nbsp;is&nbsp;" + MONTHS[GetMonthValue(lToday)] + "&nbsp;" + GetDateValue(lToday) + ",&nbsp;" + GetYearValue(lToday), "", "Show calendar for today");
    divDatePickerFooter.appendChild(lAnchorToday);
    divDatePicker.appendChild(divDatePickerFooter);

    $("#" + divDatePickerId).show();
}

function yearSelector(pvDateString, pvTargetId, pvEndControlsStartControl, pvEndControlIdToValidate) {
    disposeDatePickerYearPicker();
    disposeDatePickerMonthPicker();

    /*Get offsets*/
    var lYS = $("#" + ancYearSelectorId);
    var lYSP = lYS.position();

    /*These are needed to draw the grid*/
    var lDate = GetDate(pvDateString);
    var lYearUp = GetYearValue(lDate) - 11;
    var lYearStart = GetYearValue(lDate) - 5;
    var lYearEnd = GetYearValue(lDate) + 6;
    var lYearDown = GetYearValue(lDate) + 11;

    /*Create grid elements*/
    var divDatePickerYearPicker = document.createElement("div");
    var tblDatePickerYearPicker = document.createElement("table");
    var tblDatePickerYearPickerBody = document.createElement("tbody");

    /*Assign atributes*/
    divDatePickerYearPicker.setAttribute("id", divDatePickerYearPickerId);
    divDatePickerYearPicker.style.top = lYSP.top + "px"
    divDatePickerYearPicker.style.left = lYSP.left + "px"
    tblDatePickerYearPicker.setAttribute("id", tblDatePickerYearPickerId);

    /*These are the dates the event is for*/
    var m = GetMonthAdjustedValue(lDate);
    var d = GetDateValue(lDate);

    /*Previous year set*/
    lRowUp = document.createElement("tr");
    lCellUp = document.createElement("td");
    lCellUp.align = "center";
    lAnchorUp = createAnchorHelper(divDatePickerYearPickerId + "Up", "", "<img src=\"" + ImagePath + "datepicker_up.gif\" border=\"0\" alt=\"More years\" />", "", "");
    //lAnchorUp = createAnchorHelper(divDatePickerYearPickerId + "Up", "javascript:yearSelector('" + m + "/" + d + "/" + lYearUp + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')", "<img src=\"" + ImagePath + "datepicker_up.gif\" border=\"0\" alt=\"More years\" />", "", "");
    //lAnchorUp.setAttribute("onclick", "yearSelector('" + m + "/" + d + "/" + lYearUp + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')");
    lCellUp.appendChild(lAnchorUp);
    lRowUp.appendChild(lCellUp);
    tblDatePickerYearPickerBody.appendChild(lRowUp);

    /*Create Year List*/
    for (i = lYearStart; i <= lYearEnd; i++) {
        lRowYear = document.createElement("tr");
        lCellYear = document.createElement("td");
        lAnchorYear = createAnchorHelper("", "javascript:createGrid('" + m + "/" + d + "/" + i + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')", i, "", "");
        lAnchorYear.setAttribute("onclick", "javascript:createGrid('" + m + "/" + d + "/" + i + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')");
        lCellYear.appendChild(lAnchorYear);
        lRowYear.appendChild(lCellYear);
        tblDatePickerYearPickerBody.appendChild(lRowYear);
    }

    /*Next year set*/
    lRowDown = document.createElement("tr");
    lCellDown = document.createElement("td");
    lCellDown.align = "center";
    lAnchorDown = createAnchorHelper(divDatePickerYearPickerId + "Down", "", "<img src=\"" + ImagePath + "datepicker_down.gif\" border=\"0\" alt=\"More years\" />", "", "");
    //lAnchorDown = createAnchorHelper(divDatePickerYearPickerId + "Down", "javascript:yearSelector('" + m + "/" + d + "/" + lYearDown + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')", "<img src=\"" + ImagePath + "datepicker_down.gif\" border=\"0\" alt=\"More years\" />", "", "");
    //lAnchorDown.setAttribute("onclick", "yearSelector('" + m + "/" + d + "/" + lYearDown + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')");
    lCellDown.appendChild(lAnchorDown);
    lRowDown.appendChild(lCellDown);
    tblDatePickerYearPickerBody.appendChild(lRowDown);

    /*The year selector should be added to the divDatePicker*/
    var divDatePicker = document.getElementById("divDatePicker");

    /*Add all the cells to the table*/
    tblDatePickerYearPicker.appendChild(tblDatePickerYearPickerBody);
    divDatePickerYearPicker.appendChild(tblDatePickerYearPicker);
    divDatePicker.appendChild(divDatePickerYearPicker);

    $(document).ready(function() {
        $("#" + divDatePickerYearPickerId + "Up").click(function() {
            yearSelector(m + "/" + d + "/" + lYearUp, pvTargetId, pvEndControlsStartControl, pvEndControlIdToValidate);
            return false;
        });

        $("#" + divDatePickerYearPickerId + "Down").click(function() {
            yearSelector(m + "/" + d + "/" + lYearDown, pvTargetId, pvEndControlsStartControl, pvEndControlIdToValidate);
            return false;
        });
    });
}

function monthSelector(pvDateString, pvTargetId, pvEndControlsStartControl, pvEndControlIdToValidate) {
    disposeDatePickerYearPicker();
    disposeDatePickerMonthPicker();

    /*Get offsets*/
    var lMS = $("#" + ancMonthSelectorId);
    var lMSP = lMS.position();

    /*These are needed to draw the grid*/
    var lDate = GetDate(pvDateString);
    var lYearUp = GetYearValue(lDate) - 6;
    var lYearStart = GetYearValue(lDate) - 2;
    var lYearEnd = GetYearValue(lDate) + 3;
    var lYearDown = GetYearValue(lDate) + 6;

    /*Create grid elements*/
    var divDatePickerMonthPicker = document.createElement("div");
    var tblDatePickerMonthPicker = document.createElement("table");
    var tblDatePickerMonthPickerBody = document.createElement("tbody");

    /*Assign atributes*/
    divDatePickerMonthPicker.setAttribute("id", divDatePickerMonthPickerId);
    divDatePickerMonthPicker.style.top = lMSP.top + "px"
    divDatePickerMonthPicker.style.left = lMSP.left + "px"
    tblDatePickerMonthPicker.setAttribute("id", tblDatePickerMonthPickerId);

    /*These are the dates the event is for*/
    var d = GetDateValue(lDate);
    var y = GetYearValue(lDate);

    /*Create month list*/
    for (i = 0; i < MONTHS.length; i++) {
        var lAdjustedMonth = parseInt(i) + parseInt(1);
        lRowMonth = document.createElement("tr");
        lCellMonth = document.createElement("td");
        lAnchorMonth = createAnchorHelper("", "javascript:createGrid('" + lAdjustedMonth + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')", MONTHS[i], "", "");
        lAnchorMonth.setAttribute("onclick", "createGrid('" + lAdjustedMonth + "/" + d + "/" + y + "','" + pvTargetId + "','" + pvEndControlsStartControl + "','" + pvEndControlIdToValidate + "')");
        lCellMonth.appendChild(lAnchorMonth);
        lRowMonth.appendChild(lCellMonth);
        tblDatePickerMonthPickerBody.appendChild(lRowMonth);
    }

    /*The year selector should be added to the divDatePicker*/
    var divDatePicker = document.getElementById("divDatePicker");

    /*Add all the cells to the table*/
    tblDatePickerMonthPicker.appendChild(tblDatePickerMonthPickerBody);
    divDatePickerMonthPicker.appendChild(tblDatePickerMonthPicker);
    divDatePicker.appendChild(divDatePickerMonthPicker);
}

function createAnchorHelper(pvId, pvHref, pvInnerHTML, pvClass, pvTitle) {
    anc = document.createElement("a");
    anc.href = pvHref;
    anc.innerHTML = pvInnerHTML;
    if (pvClass != "") { anc.setAttribute("class", pvClass); }
    if (pvId != "") { anc.setAttribute("id", pvId); }
    if (pvTitle != "") { anc.setAttribute("title", pvTitle); }
    return anc;
}