var dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
var monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');

// params:
// field_name (required)
// format
// seperator
// ontop

function DatePicker(params) {
    this.refreshDatePicker = function(year, month, day) {
        var thisDay = new Date();

        if ((month >= 0) && (year > 0)) {
            thisDay = new Date(year, month, 1);
        } else {
            day = thisDay.getDate();
            thisDay.setDate(1);
        }

        var crlf = "\r\n";
        var TABLE = "<table cols=7 class='dpTable'>" + crlf;
        var xTABLE = "</table>" + crlf;
        var TR = "<tr class='dpTR'>";
        var TR_title = "<tr class='dpTitleTR'>";
        var TR_days = "<tr class='dpDayTR'>";
        var TR_todaybutton = "<tr class='dpTodayButtonTR'>";
        var xTR = "</tr>" + crlf;
        var TD = "<td class='dpTD' onMouseOut='this.className=\"dpTD\";' onMouseOver=' this.className=\"dpTDHover\";' ";    // leave this tag open, because we'll be adding an onclick event
        var TD_title = "<td colspan=5 class='dpTitleTD'>";
        var TD_buttons = "<td class='dpButtonTD'>";
        var TD_todaybutton = "<td colspan=7 class='dpTodayButtonTD'>";
        var TD_days = "<td class='dpDayTD'>";
        var TD_selected = "<td class='dpDayHighlightTD' onMouseOut='this.className=\"dpDayHighlightTD\";' onMouseOver='this.className=\"dpTDHover\";' ";    // leave this tag open, because we'll be adding an onclick event
        var xTD = "</td>" + crlf;
        var DIV_title = "<div class='dpTitleText'>";
        var DIV_selected = "<div class='dpDayHighlight'>";
        var xDIV = "</div>";

        var html = TABLE;

        html += TR_title;
        html += TD_buttons + this.getButtonCode(this.params.field_name, thisDay, -1, "&lt;") + xTD;
        html += TD_title + DIV_title + monthArrayLong[thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV + xTD;
        html += TD_buttons + this.getButtonCode(this.params.field_name, thisDay, 1, "&gt;") + xTD;
        html += xTR;

        html += TR_days;
        for (i = 0; i < dayArrayShort.length; i++)
            html += TD_days + dayArrayShort[i] + xTD;
        html += xTR;

        html += TR;

        for (i = 0; i < thisDay.getDay(); i++)
            html += TD + "&nbsp;" + xTD;

        do {
            dayNum = thisDay.getDate();
            TD_onclick = " onclick=\"updateDateField('" + this.getDateString(thisDay) + "');\">";

            if (dayNum == day)
                html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;
            else
                html += TD + TD_onclick + dayNum + xTD;

            if (thisDay.getDay() == 6)
                html += xTR + TR;

            thisDay.setDate(thisDay.getDate() + 1);
        } while (thisDay.getDate() > 1)

        if (thisDay.getDay() > 0) {
            for (i = 6; i > thisDay.getDay(); i--)
                html += TD + "&nbsp;" + xTD;
        }
        html += xTR;

        var today = new Date();
        var todayString = "Today is " + dayArrayMed[today.getDay()] + ", " + monthArrayMed[today.getMonth()] + " " + today.getDate();
        html += TR_todaybutton + TD_todaybutton;
        html += "<button class='dpTodayButton' onclick='refreshDatePicker();'>this month</button> ";
        html += "<button class='dpTodayButton' onclick='updateDateField();'>close</button>";
        html += xTD + xTR;

        html += xTABLE;

        var targetDateField = document.getElementById(this.params.field_name);
        var pos = findPos(targetDateField);
        var pickerDiv = document.getElementById(this.datePickerDivID);
        pickerDiv.innerHTML = html;

        if (this.params.ontop) {
            pickerDiv.style.top = pos.y - pickerDiv.offsetHeight + "px";
        }
        else
            pickerDiv.style.top = pos.y + targetDateField.offsetHeight + "px";
    }

    this.datePickerClosed = function(dateField) {
        var dateObj = this.getFieldDate(dateField.value);
        var today = new Date();
        today = new Date(today.getFullYear(), today.getMonth(), today.getDate());

        if (dateField.name == "StartDate") {
            if (dateObj < today) {
                alert("Please enter a date that is today or later");
                dateField.value = "";
                document.getElementById(this.datePickerDivID).style.visibility = "visible";
            } else {
                dateObj.setTime(dateObj.getTime() + (7 * 24 * 60 * 60 * 1000));
                var endDateField = document.getElementById("EndDate");
                endDateField.value = this.getDateString(dateObj);
            }
        }
    }

    this.updateDateField = function(dateString) {
        var targetDateField = document.getElementById(this.params.field_name);
        if (dateString)
            targetDateField.value = dateString;

        var pickerDiv = document.getElementById(this.datePickerDivID);
        pickerDiv.style.visibility = "hidden";
        pickerDiv.style.display = "none";
        targetDateField.focus();

        if ((dateString) && (typeof (this.datePickerClosed) == "function"))
            this.datePickerClosed(targetDateField);
    }

    this.drawDatePicker = function(targetDateField) {
        var dt = this.getFieldDate(targetDateField.value);

        if (!document.getElementById(this.datePickerDivID)) {
            var newNode = document.createElement("div");
            newNode.setAttribute("id", this.datePickerDivID);
            newNode.setAttribute("style", "visibility: hidden;");
            newNode.className = "dpDiv";
            document.body.appendChild(newNode);
        }

        var pickerDiv = document.getElementById(this.datePickerDivID);
        var pos = findPos(targetDateField);

        pickerDiv.style.position = "absolute";
        pickerDiv.style.left = pos.x + "px";
        pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");
        pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
        pickerDiv.style.zIndex = 10000;

        this.refreshDatePicker(dt.getFullYear(), dt.getMonth(), dt.getDate());
    }

    this.getButtonCode = function(dateFieldName, dateVal, adjust, label) {
        var newMonth = (dateVal.getMonth() + adjust) % 12;
        var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
        if (newMonth < 0) {
            newMonth += 12;
            newYear += -1;
        }

        return "<button class='dpButton' onclick='refreshDatePicker(" + newYear + ", " + newMonth + ");'>" + label + "</button>";
    }

    this.getDateString = function(dateVal) {
        var dayString = "00" + dateVal.getDate();
        var monthString = "00" + (dateVal.getMonth() + 1);
        dayString = dayString.substring(dayString.length - 2);
        monthString = monthString.substring(monthString.length - 2);

        switch (this.params.format) {
            case "dmy":
                return dayString + this.params.seperator + monthString + this.params.seperator + dateVal.getFullYear();
            case "ymd":
                return dateVal.getFullYear() + this.params.seperator + monthString + this.params.seperator + dayString;
            case "mdy":
            default:
                return monthString + this.params.seperator + dayString + this.params.seperator + dateVal.getFullYear();
        }
    }

    this.getFieldDate = function(dateString) {
        var dateVal;
        var dArray;
        var d, m, y;

        try {
            dArray = this.splitDateString(dateString);
            if (dArray) {
                switch (this.params.format) {
                    case "dmy":
                        d = parseInt(dArray[0], 10);
                        m = parseInt(dArray[1], 10) - 1;
                        y = parseInt(dArray[2], 10);
                        break;
                    case "ymd":
                        d = parseInt(dArray[2], 10);
                        m = parseInt(dArray[1], 10) - 1;
                        y = parseInt(dArray[0], 10);
                        break;
                    case "mdy":
                    default:
                        d = parseInt(dArray[1], 10);
                        m = parseInt(dArray[0], 10) - 1;
                        y = parseInt(dArray[2], 10);
                        break;
                }
                dateVal = new Date(y, m, d);
            } else if (dateString) {
                dateVal = new Date(dateString);
            } else {
                dateVal = new Date();
            }
        } catch (e) {
            dateVal = new Date();
        }

        return dateVal;
    }

    this.splitDateString = function(dateString) {
        var dArray;
        if (dateString.indexOf("/") >= 0)
            dArray = dateString.split("/");
        else if (dateString.indexOf(".") >= 0)
            dArray = dateString.split(".");
        else if (dateString.indexOf("-") >= 0)
            dArray = dateString.split("-");
        else if (dateString.indexOf("\\") >= 0)
            dArray = dateString.split("\\");
        else
            dArray = false;

        return dArray;
    }

    this.datePickerDivID = "datepicker";
    this.params = params;

    var defaultDateSeparator = "/";  // common values would be "/" or "."
    var defaultDateFormat = "mdy"    // valid values are "mdy", "dmy", and "ymd"
    var targetDateField = document.getElementById(this.params.field_name);

    if (!this.params.seperator) this.params.seperator = defaultDateSeparator;
    if (!this.params.format) this.params.format = defaultDateFormat;

    this.drawDatePicker(targetDateField);
}
