var calendarWidth = 175;
var calendarHeight = 143;
var calendar = null;
var weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
var errorP = null; //USED TO OUTPUT ERROR MESSAGE

//START - OPEN CALENDAR POPUP
function showCalendar(id, montharrival, dayarrival, returnmonth, returnday) {
    var title;
    var defaultDateString;
    var minDateString;
    var maxDateString;
    var minDate;
    var maxDate;

    switch (id) {
        case 0:
            title = 'Departing';
            defaultDateString = getElement(montharrival).value + '-' + getElement(dayarrival).value;
            minDate = getDateFromIsoDateString(defaultDateString);
            break;
        case 1:
            title = 'Returning';
            defaultDateString = getElement(returnmonth).value + '-' + getElement(returnday).value;
            minDate = getDateFromIsoDateString(getElement(montharrival).value + '-' + getElement(dayarrival).value);
            break;
    }

    minDateString = getIsoDateStringFromDate(minDate);

    maxDate = minDate;
    maxDate.setFullYear(maxDate.getFullYear() + 1);
    maxDateString = getIsoDateStringFromDate(maxDate);

    openCalendar(id, title, defaultDateString, minDateString, maxDateString, montharrival, dayarrival, returnmonth, returnday);
}
//END - OPEN CALENDAR POPUP

function closeCalendar() {
    if (calendar != null) {
        calendar.close();
        calendar = null;
    }
}

function openCalendar(id, title, defaultDateString, minDateString, maxDateString, monArr, dayArr, monRet, dayRet) {
    var centreParentX;
    var centreParentY;
    var windowX;
    var windowY;

    // DATE STRINGS SHOULD BE IN THE ISO STANDARD FORMAT I.E. YYYY-MM-DD

    closeCalendar();

    if (isNaN(window.screenLeft)) {
        // NETSCAPE, MOZILLA
        centreParentX = window.screenX + (window.outerWidth / 2);
        centreParentY = window.screenY + (window.outerHeight / 2);
    }
    else {
        // IE
        centreParentX = window.screenLeft + (document.body.clientWidth / 2);
        centreParentY = window.screenTop + (document.body.clientHeight / 2);
    }

    windowX = centreParentX - (calendarWidth / 2);
    windowY = centreParentY - (calendarHeight / 2);

    calendar = window.open('/utility/calendar.aspx?id=' + id + '&title=' + title + '&defaultdate=' + defaultDateString + '&mindate=' + minDateString + '&maxdate=' + maxDateString + '&monArr=' + monArr + '&dayArr=' + dayArr + '&monRet=' + monRet + '&dayRet=' + dayRet, '_blank', 'toolbar=no,menubar=no,location=no,scrollbars=no,status=no,screenX=' + windowX + ',screenY=' + windowY + ',left=' + windowX + ',top=' + windowY + ',width=' + calendarWidth + ',height=' + calendarHeight + ',resizable=no');
}

function dateSelected(id, dateString, monArr, dayArr, monRet, dayRet) {
    switch (id) {
        case 0:
            findValueInList(getElement(dayArr), dateString.substr(8, 2));
            findValueInList(getElement(monArr), dateString.substr(0, 7));
            setReturnDate(dayArr, monArr, dayRet, monRet);
            break;
        case 1:
            findValueInList(getElement(dayRet), dateString.substr(8, 2));
            findValueInList(getElement(monRet), dateString.substr(0, 7));
            setWeekDay(dayRet + '_weekday', dateString);
            break;
    }
}

function getElement(elementId) {
    if (document.getElementById) {
        return document.getElementById(elementId);
    }
    else {
        return document.all[elementId];
    }
}

function findValueInList(list, value) {
    if (list != null) {
        for (var i = 0; i < list.options.length; i++) {
            if (list.options[i].value == value) {
                list.selectedIndex = i;
                break;
            }
        }
    }
}

function setReturnDate(leaveDayId, leaveMonthId, returnDayId, returnMonthId) {
    var leaveDate;
    var returnDate;
    var returnDateString;

    leaveDate = getDateFromIsoDateString(getElement(leaveMonthId).value + '-' + getElement(leaveDayId).value);

    returnDate = leaveDate
    returnDate.setDate(returnDate.getDate() + 7);

    returnDateString = getIsoDateStringFromDate(returnDate);
    if (returnDayId.indexOf('hs_') == -1) {
        findValueInList(getElement(returnDayId), returnDateString.substr(8, 2));
        findValueInList(getElement(returnMonthId), returnDateString.substr(0, 7));
    }
    setWeekDay(leaveDayId + '_weekday', leaveDate);
    setWeekDay(returnDayId + '_weekday', returnDate);
}

function getDateFromIsoDateString(dateString) {
    var year;
    var month;
    var day;

    // DATE STRING SHOULD BE IN THE ISO STANDARD FORMAT I.E. YYYY-MM-DD

    year = parseInt(dateString.substr(0, 4));
    // USE parseFloat AS parseInt INTERPRETS '01' AS 0 INSTEAD OF 1
    month = parseFloat(dateString.substr(5, 2));
    day = parseFloat(dateString.substr(8, 2));

    return new Date(year, month - 1, day);
}

function getIsoDateStringFromDate(date) {
    var year;
    var month;
    var day;

    // FORMAT DATE IN THE ISO STANDARD FORMAT I.E. YYYY-MM-DD

    year = date.getFullYear().toString();

    month = (date.getMonth() + 1).toString();
    if (month.length == 1) {
        month = '0' + month;
    }

    day = date.getDate().toString();
    if (day.length == 1) {
        day = '0' + day;
    }

    return year + '-' + month + '-' + day;
}


function checkAllCarTypes() {
    var csform = document.getElementById('csform');
    var formLength = csform.getElementsByTagName('input').length;
    for (var i = 0; i <= formLength - 1; i++) {
        if (csform.getElementsByTagName('input')[i].type == 'checkbox') {
            if (csform.getElementsByTagName('input')[i].checked) {
                csform.getElementsByTagName('input')[i].checked = false
            } else {
                csform.getElementsByTagName('input')[i].checked = true
            }
        }
    }
}

function setWeekDay(id, selectedDate) {
    var tempSelectedDate = null;
    if (getElement(id)) {
        try {
            tempSelectedDate = getDateFromIsoDateString(selectedDate);
        } catch (err) {
            tempSelectedDate = selectedDate;
        }
        getElement(id).innerHTML = weekDays[tempSelectedDate.getDay()];
    }
}

function todayAsString() {
    var today = new Date()
    return weekDays[today.getDay()].substring(0, 3);
}

function todayAsStringFromElement(day, monYear) {
    if (day.length > 0 && monYear.length > 0) {
        var year = monYear.substring(0, 4);
        var mon = monYear.substring(5) - 1;
        var myDate = new Date();
        myDate.setFullYear(year, mon, day);
        return weekDays[myDate.getDay()].substring(0, 3);
    }
}

function addOnLoadEvent(show, hide1, hide2, tab) {
    if (window.addEventListener) {
        // W3C method
        window.addEventListener('load', toggleSearchBoxes(show, hide1, hide2, tab), false);
    }
    else if (window.attachEvent) {
        // IE method
        window.attachEvent('onload', toggleSearchBoxes(show, hide1, hide2, tab));
    }
}
//function validateInputBox(inputId, fromDay, fromMonth, toDay, toMonth) {
function validateInputBox(inputId, departDate, returnDate) {
    var retVal = true;
    var errors = new Array();
    if (getElement(inputId)) {
        var elementType = getElement(inputId).tagName;
        var destError = false;
        switch(elementType){
            case 'SELECT':
                if (getElement(inputId).selectedIndex == 0) {
                    destError = true;
                }
                break;  
            case 'INPUT':
                if (getElement(inputId).value.trim().length == 0) {
                    destError = true;
                }
                break;
        }
        if (destError) {
            errors.push("Please ensure that you have chosen a location");
            retVal = false;
        }
    }
    if (getElement(departDate)) {
        if (getElement(departDate).value.trim().length === 10) {
            var today = new Date();
            today = getDateFromIsoDateString(convertToTenDigitDateString(today.getFullYear(), today.getMonth() + 1, today.getDate()));
            var fromDate = new Date(getElement(departDate).value.substr(6, 4), getElement(departDate).value.substr(3, 2) - 1, getElement(departDate).value.substr(0, 2));
            if (fromDate < today) {
                //CHECK THAT THE START DATE IS IN THE FUTURE
                errors.push("Please ensure that the start date for your search is in the future");
                retVal = false;
            } else if (fromDate.getDate() != parseFloat(getElement(departDate).value.substr(0, 2)) || fromDate.getMonth() + 1 != parseFloat(getElement(departDate).value.substr(3, 2)) || fromDate.getFullYear() != parseInt(getElement(departDate).value.substr(6, 4))) {
                //CHECK THAT THE DATE IS VALID. IF YOU ATTEMPT TO PARSE AN IMPOSSIBLE DATE IN JAVASCRIPT RATHER THAN
                //ERRORING IT SIMPLY ROLLS THE DAYS OVER TO THE NEXT MONTH i.e. new Date(2010,02-1,29) RETURNS 1ST MARCH
                errors.push("Please ensure that the start date does not fall on an invalid date i.e. 30th Feb");
                retVal = false;
            }
        } else { 
            errors.push("Please enter a start date");
            retVal = false;
        }
        if (getElement(returnDate)) {
            if (getElement(returnDate).value.trim().length === 10) {
                var toDate = new Date(getElement(returnDate).value.substr(6, 4), getElement(returnDate).value.substr(3, 2) - 1, getElement(returnDate).value.substr(0, 2));
                if (toDate < today) {
                    //CHECK THAT THE END DATE IS IN THE FUTURE
                    errors.push("Please ensure that the end date for your search is in the future");
                    retVal = false;
                } else if (toDate < fromDate) {
                    //CHECK THAT THE END DATE IS AFTER THE START DATE
                    errors.push("Please ensure that the end date for your search is after the start date");
                    retVal = false;
                } else if (toDate.getDate() != parseFloat(getElement(returnDate).value.substr(0, 2)) || toDate.getMonth() + 1 != parseFloat(getElement(returnDate).value.substr(3, 2)) || toDate.getFullYear() != parseInt(getElement(returnDate).value.substr(6, 4))) {
                    //CHECK THAT THE DATE IS VALID. IF YOU ATTEMPT TO PARSE AN IMPOSSIBLE DATE IN JAVASCRIPT RATHER THAN
                    //ERRORING IT SIMPLY ROLLS THE DAYS OVER TO THE NEXT MONTH i.e. new Date(2010,02-1,29) RETURNS 1ST MARCH
                    errors.push("Please ensure that the end date does not fall on an invalid date i.e. 30th Feb");
                    retVal = false;
                }
            } else {
                errors.push("Please enter an end date");
                retVal = false;
            }
            
        }
    }
    if (errors.length > 0) {
        var errorString = new String();
        for (var i = 0; i < errors.length; i++) {
            errorString += errors[i] + '<br />';
        }
        if (getElement('erroroutput')) {
            if (errorP != null) {
                errorP.parentNode.removeChild(errorP); 
            }
            errorP = document.createElement('p');
            errorP.innerHTML = '';
            errorP.innerHTML = errorString;
            getElement('erroroutput').appendChild(errorP);
            getElement('erroroutput').style.visibility = 'visible';
        }        
    }
    return retVal;
}

function hideError() {
    if (getElement('erroroutput')) {
        errorP.innerHTML = "";
        getElement('erroroutput').style.visibility = 'hidden';
    }
}

function convertToTenDigitDateString(fullYear, month, day) {
    if (day.toString().length == 1) {
        day = '0' + day;
    }
    if (month.toString().length == 1) {
        month = '0' + month;
    }
    return fullYear + '-' + month + '-' + day;
}

String.prototype.trim = function() {
    return this.replace(/^\s*|\s*$/g, '');
}