//calendar generator
var daysPerMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var isLeap = false;


function isLeapYear ( year ) {
    return new Date('Feb 29, ' + year).getMonth() === 1;
}


var dayArrayShort = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
var dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
var dayArrayLong = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var monthArrayShort = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
var monthArrayLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var datePickerUlID = 'calendar1';


function displayDatePicker ( dateFieldName, displayBelowThisObject, dtFormat, dtSep ) {
    var targetDateField = document.getElementsByName (dateFieldName).item(0);

    if ( !displayBelowThisObject ) {
        displayBelowThisObject = targetDateField;
    }

    if ( dtSep ) {
        dateSeparator = dtSep;
    } else {
        dateSeparator = defaultDateSeparator;
    }

    if ( dtFormat ) {
        dateFormat = dtFormat;
    } else {
        dateFormat = defaultDateFormat;
    }

    var x = displayBelowThisObject.offsetLeft;
    var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight;
    
    var tmp = displayBelowThisObject.offsetParent;
    while ( tmp ) {
        x += tmp.offsetLeft;
        y += tmp.offsetTop;
        tmp = tmp.offsetParent;
    }

    drawDatePicker(targetDateField, x, y);
}


function drawDatePicker ( targetDateField, x, y ) {
    var dt = getFieldDate(targetDateField.value );

    if (!document.getElementById(datePickerUlID)) {
        var newNode = document.createElement("ul");
        newNode.setAttribute("id", datePickerUlID);
        //newNode.setAttribute("class", "calendar");
        newNode.className = 'calendar';
        newNode.setAttribute("style", "display:none;");
        document.body.appendChild(newNode);
    }

    var pickerDiv = document.getElementById(datePickerUlID);
    pickerDiv.style.left = x + "px";
    pickerDiv.style.top = y + "px";
    pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
    pickerDiv.style.zIndex = 10000;

    refreshDatePicker(targetDateField.name, dt.getFullYear(), dt.getMonth(), dt.getDate());
}


function getButtonCode ( dateFieldName, dateVal, adjust, img, alt ) {
    var newMonth = (dateVal.getMonth () + adjust) % 12;
    var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
    if ( newMonth < 0 ) {
        newMonth += 12;
        newYear += -1;
    }
    if ( typeof(alt) == 'undefined' ) {
        alt = '';
    }
    return '<a href="#" onclick="refreshDatePicker(\'' + dateFieldName + '\', ' + newYear + ', ' + newMonth + '); return false;" onfocus="this.blur();"><img alt="' + alt + '" src="images/' + img + '" /></a>';
}


function getDateString ( 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 (dateFormat) {
        case "dmy" :
            return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
        case "ymd" :
            return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
        case "mdy" :
        default :
            return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
    }
}


function getFieldDate ( dateString ) {
    var dateVal;
    var dArray;
    var d, m, y;

    try {
        dArray = splitDateString(dateString);
        if ( dArray ) {
            switch ( dateFormat ) {
                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;
}


function splitDateString ( dateString ) {
    if (dateString.indexOf("/")  >= 0) { return dateString.split("/"); }
    if (dateString.indexOf(".")  >= 0) { return dateString.split("."); }
    if (dateString.indexOf("-")  >= 0) { return dateString.split("-"); }
    if (dateString.indexOf("\\") >= 0) { return dateString.split("\\"); }
}


function updateDateField ( dateFieldName, dateString ) {
    var targetDateField = document.getElementsByName (dateFieldName).item(0);
    if ( dateString ) {
        targetDateField.value = dateString;
    }

    var pickerDiv = document.getElementById(datePickerUlID);
    pickerDiv.style.display = "none";

    targetDateField.focus();
}


function refreshDatePicker ( dateFieldName, year, month, day ) {
    var prevMonth = (month == 0) ? 11 : (month - 1);
    var daysInPrev = (prevMonth == 1 && isLeapYear(year)) ? 29 : daysPerMonth[prevMonth];
    var firstDay = 0;

    var thisDay = new Date();
    if ( month >= 0 && year > 0 ) {
        thisDay = new Date(year, month, 1); // first day of selected month
    } else {
        day = thisDay.getDate();
        thisDay.setDate(1);
    }

    var crlf = "\r\n";
    var LI = '<li>';
    var LI_title = '<li class="month">';
    var LI_weekdays = '<li class="dayType">';
    var A_active = '<a href="#" class="active"';
    var LI_otherMonth = '<li class="passive">';
    var xLI = '</li>' + crlf;
    var A_thisMonth = '<a href="#" ';
    var xA = '</a>';

    var html = crlf + LI_title + getButtonCode(dateFieldName, thisDay, -1, 'bullet-blue-strong-reverse.gif', 'previous');
    html += monthArrayLong[thisDay.getMonth()] + '/' + thisDay.getFullYear() + crlf + getButtonCode(dateFieldName, thisDay, 1, 'bullet-blue-strong.gif', 'next') + crlf + xLI + crlf;

    for ( i=0; i<dayArrayShort.length; i++ ) {
        html += LI_weekdays + dayArrayShort[i] + xLI;
    }

    firstDay = thisDay.getDay();
    for ( i=daysInPrev-firstDay+1; i<=daysInPrev; i++ ) {
        html += LI_otherMonth + i + xLI;
    }

    do {
        dayNum = thisDay.getDate();
        A_onclick = ' onclick="updateDateField(\'' + dateFieldName + '\', \'' + getDateString(thisDay) + '\'); return false;">';
        if ( dayNum == day ) {
            html += LI + A_active + A_onclick + dayNum + xA + xLI;
        } else {
            html += LI + A_thisMonth + A_onclick + dayNum + xA + xLI;
        }
        thisDay.setDate(thisDay.getDate()+1);
    } while ( thisDay.getDate() > 1 );

    for ( i = 1; thisDay.getDay()>0 && i<(8 - thisDay.getDay()); i++ ) {
        html += LI_otherMonth + i + xLI;
    }
    document.getElementById(datePickerUlID).innerHTML = html;
}
