



function DatePicker(textBox, table, yearBox,monthBox,todayButton, clearButton, today, minDate, maxDate) {
    if (!textBox) {
        alert('No textBox')
    }
    if (!today) {
        alert('No today')
    }
    if (!table) {
        alert('No table')
    }
    if (!yearBox) {
        alert('No yearBox')
    }
    if (!monthBox) {
        alert('No monthBox')
    }


    if (!minDate) {
        alert('No minDate')
    }

    if (!maxDate) {
        alert('No maxDate')
    }

    var offsetTopRows = 2;
    var offsetBottomRows = 1;

    var Year = -1;
    var Month = -1;

    var monthItems = GetOptions();
    ClearOptions();
    var offsetRows = offsetTopRows + offsetBottomRows;
    var tableBody = table.getElementsByTagName('TBODY')[0];

    HookEvent(yearBox, "change", OnYearChange);
    HookEvent(monthBox, "change", OnMonthChange);

    dateorder = "ymd"

    if (todayButton) {
        if (minDate <= today && maxDate >= today) {
            todayButton.onclick = ToDayClick;
        }
        else {
            todayButton.style.display = 'none';
        }
    }
    if (clearButton) {
        clearButton.onclick = ClearClick;
    }

    function ToDayClick() {
        textBox.value = GetDateString(today);
        Close();
        return false;
    }
    function ClearClick() {
        textBox.value = "";
        Close();
        return false;
    }

    function OnYearChange() {
        var value = parseInt(yearBox.value);
        if (value >= minDate.getFullYear() && value <= maxDate.getFullYear()) {

            Year = value;
            DrawMonths();
            DrawDays();
        }
    }


    function Close() {
    }

    function OnMonthChange() {
        var value = parseInt(monthBox.value);
        Month = value;
        DrawDays();
    }


    this.Refresh = function() {
        var currentDate;
        currentDate = GetDateFromString(textBox.value);

        if (!currentDate && (Year == -1 || Month == -1)) {
            currentDate = today;
            yearBox.value = currentDate.getFullYear();
            monthBox.value = currentDate.getMonth();
        }
        if (currentDate) {
            if (currentDate > maxDate) {
                currentDate = maxDate;
            }
            if (currentDate < minDate) {
                currentDate = minDate;
            }
            Year = currentDate.getFullYear();
            Month = currentDate.getMonth();
            DrawMonths();
        }
        DrawDays();
    }

    function HookEvent(element, eventName, callback) {
        if (typeof (element) == "string")
            element = document.getElementById(element);
        if (element == null)
            return;
        if (element.addEventListener) {
            element.addEventListener(eventName, callback, false);
        }
        else if (element.attachEvent)
            element.attachEvent("on" + eventName, callback);
    }

    function DrawMonths() {
        ClearOptions();
        var minMonth
        if (minDate.getFullYear() == Year) {
            minMonth = minDate.getMonth();
            if (minMonth > Month) {
                Month = minMonth;
            }
        }
        else
        {
            minMonth = 0;
        }
        var maxMonth
        if (maxDate.getFullYear() == Year) {
            maxMonth = maxDate.getMonth();
            if (maxMonth < Month) {
                Month = maxMonth;
            }
        }
        else
        {
            maxMonth = 11;
        }
        var i;
        for (i = minMonth; i <= maxMonth; i++) {
            monthBox.appendChild(monthItems[i]);
        }
        monthBox.options.selectedIndex = Month - minMonth;
    }
    function DrawDays() {
        var i;
        var rows = GetRows();
        if (rows.length > offsetRows) {
            for (i = offsetTopRows; i < rows.length - offsetBottomRows; i++) {
                rows[i].parentNode.removeChild(rows[i]);
            }
        }
        var endDate = Date.UTC(Year, Month + 1, 1, 0, 0, 0);
        var startDate = Date.UTC(Year, Month, 1, 0, 0, 0);

        var maxday = (endDate - startDate) / (24 * 3600000)


        var dayDate = new Date(Year, Month, 1);
        var firstWeekDay = dayDate.getDay()
        if (firstWeekDay == 0) {
            firstWeekDay = 7
        }
        firstWeekDay--;
        var lastRow = rows[rows.length - offsetBottomRows];
        var weekIndex = 0;
        var row;
        row = table.ownerDocument.createElement("TR");
        tableBody.insertBefore(row, lastRow);
        row.className = "DatePickerDaysTR";

        var cell;
        for (i = 0; i < firstWeekDay; i++) {
            cell = table.ownerDocument.createElement("TD");
            row.appendChild(cell);
        }

        var cssSufix;

        var dayNumber = 1;
        var dayDate = new Date(Year, Month, dayNumber);
        for (i = firstWeekDay; i < 7; i++) {
            cell = table.ownerDocument.createElement("TD");
            row.appendChild(cell);
            cell.appendChild(table.ownerDocument.createTextNode('' + (dayNumber)));
            dayDate = new Date(Year, Month, dayNumber);
            cssSufix = (!(today > dayDate) && !(today < dayDate)) ? 'Today' : '';
            if (dayDate >= minDate && dayDate <= maxDate) {
                SetDayClickEvent(cell, dayDate);
                cell.className = i > 4 ? 'DatePickerDaysTDWeekendActive' + cssSufix : 'DatePickerDaysTDActive' + cssSufix;
            }
            else {
                cell.className = i > 4 ? 'DatePickerDaysTDWeekendDisabled' + cssSufix : 'DatePickerDaysTDDisabled' + cssSufix;
            }
            dayNumber++;
        }
        while (dayNumber <= maxday) {
            row = table.ownerDocument.createElement("TR");
            tableBody.insertBefore(row, lastRow);
            row.className = "DatePickerDaysTR";            
            for (i = 0; i < 7; i++) {
                cell = table.ownerDocument.createElement("TD");
                row.appendChild(cell);
                dayDate = new Date(Year, Month, dayNumber);
                if (dayNumber <= maxday) {
                    cell.appendChild(table.ownerDocument.createTextNode('' + (dayNumber)));
                    cssSufix = (!(today > dayDate) && !(today < dayDate)) ? 'Today' : '';
                    if (dayDate >= minDate && dayDate <= maxDate) {
                        SetDayClickEvent(cell, dayDate);
                        cell.className = i > 4 ? 'DatePickerDaysTDWeekendActive' + cssSufix : 'DatePickerDaysTDActive' + cssSufix;
                    }
                    else {
                        cell.className = i > 4 ? 'DatePickerDaysTDWeekendDisabled' + cssSufix : 'DatePickerDaysTDDisabled' + cssSufix;
                    }
                    dayNumber++;
                }
            }
        }
    }

    function SetDayClickEvent(cell, day) {
        cell.onclick = click;
        cell.style.cursor = "pointer";
        cell.setAttribute("closeonclick", "closeonclick");
        function click() {
            textBox.value = GetDateString(day);
            Close();
        }
    }

    function GetDateString(date) {
        var year = date.getFullYear(); 
        var monthValue = (date.getMonth() + 1);
        var day = date.getDate();
        return year + '-' + (monthValue < 10 ? '0' + monthValue : monthValue) + '-' + (day < 10 ? '0' + day : day);
    }

    function GetDateFromString(op) {
        var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$");
        var m = op.match(yearFirstExp);
        var day, month, year;
        if (m != null && (m[2].length == 4 || dateorder == "ymd")) {
            day = m[6];
            month = m[5];
            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10))
        }
        else {
            if (dateorder == "ymd") {
                return null;
            }
            var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.)?\\s*$");
            m = op.match(yearLastExp);
            if (m == null) {
                return null;
            }
            if (dateorder == "mdy") {
                day = m[3];
                month = m[1];
            }
            else {
                day = m[1];
                month = m[3];
            }
            year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10))
        }
        month -= 1;
        var date = new Date(year, month, day);
        if (year < 100) {
            date.setFullYear(year);
        }
        return (typeof (date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date : null;


        function GetFullYear(year) {
            var twoDigitCutoffYear = val.cutoffyear % 100;
            var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;
            return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));
        }
        
    }


    function GetRows() {
        var childs = tableBody.childNodes;
        var rows = new Array();
        var child;
        var i;
        for (i = 0; i < childs.length; i++) {
            child = childs[i];
            if (child.tagName == "TR") {
                rows.push(child);
            }
        }
        return rows;
    }
    function GetOptions() {
        var childs = monthBox.childNodes;
        var items = new Array();
        var child;
        var i;
        for (i = 0; i < childs.length; i++) {
            child = childs[i];
            if (child.tagName == "OPTION") {
                items.push(child);
            }
        }
        return items;
    }
    function ClearOptions() {
        while (monthBox.childNodes.length > 0) {
            monthBox.removeChild(monthBox.firstChild);
        }
    }
    
}