﻿function positionInfo(object) {

    var p_elm = object;

    this.getElementLeft = getElementLeft;
    function getElementLeft() {
        var x = 0;
        var elm;
        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            x += elm.offsetLeft;
            elm = elm.offsetParent;
        }
        return parseInt(x);
    }

    this.getElementWidth = getElementWidth;
    function getElementWidth() {
        var elm;
        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetWidth);
    }

    this.getElementRight = getElementRight;
    function getElementRight() {
        return getElementLeft(p_elm) + getElementWidth(p_elm);
    }

    this.getElementTop = getElementTop;
    function getElementTop() {
        var y = 0;
        var elm;
        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            y += elm.offsetTop;
            elm = elm.offsetParent;
        }
        return parseInt(y);
    }

    this.getElementHeight = getElementHeight;
    function getElementHeight() {
        var elm;
        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetHeight);
    }

    this.getElementBottom = getElementBottom;
    function getElementBottom() {
        return getElementTop(p_elm) + getElementHeight(p_elm);
    }
}

function CalendarControl() {

    var calendarId = 'CalendarControl';
    var currentYear = 0;
    var currentMonth = 0;
    var currentDay = 0;

    var selectedYear = 0;
    var selectedMonth = 0;
    var selectedDay = 0;

    var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
    var dateField = null;

    function getProperty(p_property) {
        var p_elm = calendarId;
        var elm = null;

        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        if (elm != null) {
            if (elm.style) {
                elm = elm.style;
                if (elm[p_property]) {
                    return elm[p_property];
                } else {
                    return null;
                }
            } else {
                return null;
            }
        }
    }

    function setElementProperty(p_property, p_value, p_elmId) {
        var p_elm = p_elmId;
        var elm = null;

        if (typeof (p_elm) == "object") {
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        if ((elm != null) && (elm.style != null)) {
            elm = elm.style;
            elm[p_property] = p_value;
        }
    }

    function setProperty(p_property, p_value) {
        setElementProperty(p_property, p_value, calendarId);
    }

    function getDaysInMonth(year, month) {
        return [31, ((!(year % 4) && ((year % 100) || !(year % 400))) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
    }

    function getDayOfWeek(year, month, day) {
        var date = new Date(year, month - 1, day)
        return date.getDay();
    }

    this.clearDate = clearDate;
    function clearDate() {
        dateField.value = '';
        hide();
    }

    this.setDate = setDate;
    function setDate(year, month, day) {
        if (dateField) {
            if (month < 10) { month = "0" + month; }
            if (day < 10) { day = "0" + day; }

            var dateString = day + "/" + month + "/" + year;
            dateField.value = dateString;
            hide();
        }
        return;
    }

    this.changeMonth = changeMonth;
    function changeMonth(change) {
        currentMonth += change;
        currentDay = 0;
        if (currentMonth > 12) {
            currentMonth = 1;
            currentYear++;
        } else if (currentMonth < 1) {
            currentMonth = 12;
            currentYear--;
        }
        calendar = document.getElementById(calendarId);
        if (document.all) {
            calendar.innerHTML = calendarDrawTable(currentYear, currentMonth);
        } else {
            calendar.replaceChild(calendarDrawTable(currentYear, currentMonth), calendar.childNodes[0]);
        }
    }

    this.changeYear = changeYear;
    function changeYear(change) {
        currentYear += change;
        currentDay = 0;
        calendar = document.getElementById(calendarId);
        if (document.all) {
            calendar.innerHTML = calendarDrawTable(currentYear, currentMonth);
        } else {
            calendar.replaceChild(calendarDrawTable(currentYear, currentMonth), calendar.childNodes[0]);
        }
    }

    function getCurrentYear() {
        var year = new Date().getYear();
        if (year < 1900) year += 1900;
        return year;
    }

    function getCurrentMonth() {
        return new Date().getMonth() + 1;
    }

    function getCurrentDay() {
        return new Date().getDate();
    }

    function calendarDrawTable() {

        var dayOfMonth = 1;
        var validDay = 0;
        var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth);
        var daysInMonth = getDaysInMonth(currentYear, currentMonth);
        var css_class = null; //CSS class for each day
        
        var table, row, cell, a, txtNode;
        //create the table
        table = document.createElement("table");
        table.setAttribute('cellpadding', '0');
        table.setAttribute('cellspacing', '0');
        table.setAttribute('border', '0');
        //first row (month)
        row = document.createElement("tr");
        row.setAttribute("class", "header");
        //first row, cell
        cell = document.createElement("td")
        cell.setAttribute("colspan", "7");
        cell.setAttribute("class", "title");
        //first row, cell content
        a = document.createElement("a");
        a.setAttribute("href", 'javascript:changeCalendarControlMonth(-1);');
        a.appendChild(document.createTextNode("<"));
        cell.appendChild(a);
        cell.appendChild(document.createTextNode(" "+months[currentMonth - 1]+" "));
        a = document.createElement("a");
        a.setAttribute("href", 'javascript:changeCalendarControlMonth(1);');
        a.appendChild(document.createTextNode(">"));
        cell.appendChild(a);
        
        row.appendChild(cell);
        table.appendChild(row);


        //second row (Year)
        row = document.createElement("tr");
        row.setAttribute("class", "header");
        //first row, cell
        cell = document.createElement("td")
        cell.setAttribute("colspan", "7");
        cell.setAttribute("class", "title");
        //first row, cell content
        a = document.createElement("a");
        a.setAttribute("href", 'javascript:changeCalendarControlYear(-1);');
        a.appendChild(document.createTextNode("«"));
        cell.appendChild(a);
        cell.appendChild(document.createTextNode(" " + currentYear + " "));
        a = document.createElement("a");
        a.setAttribute("href", 'javascript:changeCalendarControlYear(1);');
        a.appendChild(document.createTextNode("»"));
        cell.appendChild(a);

        row.appendChild(cell);
        table.appendChild(row);

        
        //third row (weekdays)
        row = document.createElement("tr");
        row.setAttribute("class", "header");
        //third row, first cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("S"));
        row.appendChild(cell);
        //third row, second cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("M"));
        row.appendChild(cell);
        //third row, third cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("T"));
        row.appendChild(cell);
        //third row, fourth cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("W"));
        row.appendChild(cell);
        //third row, fifth cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("T"));
        row.appendChild(cell);
        //third row, sixth cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("F"));
        row.appendChild(cell);
        //third row, seventh cell
        cell = document.createElement("th")
        cell.appendChild(document.createTextNode("S"));
        row.appendChild(cell);
        //append row to table
        table.appendChild(row);

        for (var week=0;week<6;week++){
            row = document.createElement("tr");
            for (var dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {
                if (week == 0 && startDayOfWeek == dayOfWeek) {
                    validDay = 1;
                } else if (validDay == 1 && dayOfMonth > daysInMonth) {
                    validDay = 0;
                }
                //create the date cell
                cell=document.createElement("td");
                if (validDay) {
                    if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) {
                        css_class = 'current';
                    } else if (dayOfWeek == 0 || dayOfWeek == 6) {
                        css_class = 'weekend';
                    } else {
                        css_class = 'weekday';
                    }
                    //create the date link and append to cell
                    a = document.createElement("a");
                    a.setAttribute("class", css_class);
                    a.setAttribute("href", "javascript:setCalendarControlDate(" + currentYear + "," + currentMonth + "," + dayOfMonth + ")");
                    a.appendChild(document.createTextNode(dayOfMonth));
                    cell.appendChild(a);
                    dayOfMonth++;
                } else {
                    cell.setAttribute("class","empty");
                    cell.appendChild(document.createTextNode(" "));
                }
                row.appendChild(cell);
                table.appendChild(row);
            }
        }
        
        row = document.createElement("tr");
        row.setAttribute("class", "header");
        cell=document.createElement("th");
        cell.setAttribute("colspan","7");
        cell.setAttribute("style","padding:3px;");
        a=document.createElement("a");
        a.setAttribute("href","javascript:clearCalendarControl();");
        a.appendChild(document.createTextNode("Clear"));
        cell.appendChild(a);
        cell.appendChild(document.createTextNode(" | "));
        a=document.createElement("a");
        a.setAttribute("href","javascript:hideCalendarControl();");
        a.appendChild(document.createTextNode("Close"));
        cell.appendChild(a);
        row.appendChild(cell);
        table.appendChild(row);
        if (!document.all) {
            return table;
        } else {
            div = document.createElement("div");
            div.appendChild(table);
            return div.innerHTML;
        }
    }

    this.show = show;
    function show(field) {
        can_hide = 0;

        // If the calendar is visible and associated with
        // this field do not do anything.
        if (dateField == field) {
            return;
        } else {
            dateField = field;
        }

        if (dateField) {
            try {
                var dateString = new String(dateField.value);
                var dateParts = dateString.split("/");

                selectedMonth = parseInt(dateParts[1], 10);
                selectedDay = parseInt(dateParts[0], 10);
                selectedYear = parseInt(dateParts[2], 10);
            } catch (e) { }
        }

        if (!(selectedYear && selectedMonth && selectedDay)) {
            selectedMonth = getCurrentMonth();
            selectedDay = getCurrentDay();
            selectedYear = getCurrentYear();
        }

        currentMonth = selectedMonth;
        currentDay = selectedDay;
        currentYear = selectedYear;

        if (document.getElementById) {
            calendar = document.getElementById(calendarId);
            if (document.all) {
                calendar.innerHTML = calendarDrawTable(currentYear, currentMonth);
            } else {
                calendar.replaceChild(calendarDrawTable(currentYear, currentMonth), calendar.childNodes[0]);
            }
            setProperty('display', 'block');
            var fieldPos = new positionInfo(dateField);
            var calendarPos = new positionInfo(calendarId);

            var x = fieldPos.getElementLeft();
            var y = fieldPos.getElementBottom();

            setProperty('left', x + "px");
            setProperty('top', y + "px");
            if (document.all) {
                setElementProperty('display', 'block', 'CalendarControlIFrame');
                setElementProperty('left', x + "px", 'CalendarControlIFrame');
                setElementProperty('top', y + "px", 'CalendarControlIFrame');
                setElementProperty('width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame');
                setElementProperty('height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame');
            }
        }
    }

    this.hide = hide;
    function hide() {
        if (dateField) {
            setProperty('display', 'none');
            setElementProperty('display', 'none', 'CalendarControlIFrame');
            dateField = null;
        }
    }

    this.visible = visible;
    function visible() {
        return dateField
    }

    this.can_hide = can_hide;
    var can_hide = 0;
}

var calendarControl = new CalendarControl();

function showCalendarControl(textField) {
    // textField.onblur = hideCalendarControl;
    calendarControl.show(textField);
}

function clearCalendarControl() {
    calendarControl.clearDate();
}

function hideCalendarControl() {
    if (calendarControl.visible()) {
        calendarControl.hide();
    }
}

function setCalendarControlDate(year, month, day) {
    calendarControl.setDate(year, month, day);
}

function changeCalendarControlYear(change) {
    calendarControl.changeYear(change);
}

function changeCalendarControlMonth(change) {
    calendarControl.changeMonth(change);
}

document.write("<iframe id='CalendarControlIFrame' src='javascript:false;' frameBorder='0' scrolling='no'></iframe>");
document.write("<div id='CalendarControl'><div></div></div>");
