var ONE_SECOND = 1000;
var ONE_MINUTE = 60 * ONE_SECOND;
var ONE_HOUR = 60 * ONE_MINUTE;
var ONE_DAY = 24 * ONE_HOUR;
var ONE_WEEK = 7 * ONE_DAY;
var MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var WEEKDAYS_THREE = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

function isSameDate(date1, date2) {
	if (date1 == date2) {
		return true;
	} else {
		if (date1 && date2) {
			return date1.getMonth() == date2.getMonth() && date1.getFullYear() == date2.getFullYear() && date1.getDate() == date2.getDate()		
		}
	}
	return false;
}

// The getMonthLen code seed taken from the JS Bible Gold, 4th Edition.  Listing 49-01, errata version (DST fixed)
//  month is 0-11
function getMonthLen(theYear, theMonth) {
    var oneHour = 1000 * 60 * 60;
    var oneDay  = oneHour * 24;
    var thisMonth   = new Date(theYear, theMonth,     1);
    var nextMonth   = new Date(theYear, theMonth + 1, 1);

    return (Math.ceil((nextMonth.getTime() - thisMonth.getTime() - oneHour)/oneDay));
}

// When the month changes, change the number of days available in the day dropdown.
function updateDaysInMonth(day, month, year) {
    // Expedia supports only 330 days, not 365    
    var current_date = new Date();
    var NUM_OF_DAYS_CI_AVAILABILITY = 329;
    var current_date_ms = current_date.getTime();
    var available_end_ci_date_ms = current_date_ms + (NUM_OF_DAYS_CI_AVAILABILITY * ONE_DAY);
    var available_end_ci_date = new Date(available_end_ci_date_ms);
    var available_end_co_date_ms = available_end_ci_date_ms + ONE_DAY;
    var available_end_co_date = new Date(available_end_co_date_ms);
    
    //alert('availability limit: ci=' + available_end_ci_date.toString() + ", co=" + available_end_co_date.toString());
    // Note: available_end_date will be in the 11th month

    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var myForm = getMyForm();
	var d = myForm[day];
	var m = myForm[month];
	var y = myForm[year];
    
    var startDayInSelectedMonth = 1;

    var originalIndex = d.selectedIndex;
    
    var monthFull = m[m.selectedIndex].text;
    var year = y.value;
    var col = monthFull.length - 4;
    if (col > 0 && monthFull.charAt(col - 1) == ' ') {
        year = monthFull.substr(col);
    }    
    
    var daysInSelectedMonth = getMonthLen(year, m[m.selectedIndex].value - 1);
    
    if (month.substr(0,2) == "CO") {
        if (tomorrowsDate) {
            if (m.selectedIndex == 1) { // tomorrow's month
                startDayInSelectedMonth = tomorrowsDate.getDate();
            }
            else if (m.selectedIndex == 12) { // Only show up to 330 days (Expedia)
                daysInSelectedMonth = available_end_co_date.getDate();
            }
        }
    }
    else {
        if (todaysDate) {
            if (m.selectedIndex == 1) { // this month
                startDayInSelectedMonth = todaysDate.getDate();
            }
            else if (m.selectedIndex == 12) { // Only show up to 330 days (Expedia)
                daysInSelectedMonth = available_end_ci_date.getDate();
            }
        }
    }
    
    var selectedDayOfMonth = d[d.selectedIndex].value;
    var selectedNewIndex = -1;
    d.length = daysInSelectedMonth + 1 - (startDayInSelectedMonth - 1);
    
    // -1 means not selected in SearchForm.
    d.options[0] = new Option('', -1);
    
    // add the rest of the days for the month
    for (i = startDayInSelectedMonth; i <= daysInSelectedMonth; ++i) {
        d.options[i - (startDayInSelectedMonth - 1)] = new Option(i, i);
        if (i == selectedDayOfMonth) {
            selectedNewIndex = i - (startDayInSelectedMonth - 1);
        }
    }

    if (originalIndex > 0) {
	    // handle when the day selected is no longer available (ex, 31 july, user selcts feb.  Day should change to 28)
	    if (selectedNewIndex == -1) {
	        if (selectedDayOfMonth > daysInSelectedMonth) {
	            d.selectedIndex = d.length - 1;
	        }
	        else {
	            d.selectedIndex = (d.length == 1) ? 0 : 1;
	        }
	    } else {
	        d.selectedIndex = selectedNewIndex;
	    }
    }    
    y.value = year;
}

function determineIfCheckoutSelectedByUser() {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var f = getMyForm();
    if (f.CODay.value != -1 || f.COMonth.value != -1) {
        checkOutSelectedByUser = true;
    } else {
        checkOutSelectedByUser = false;
    }
}


function determineIfCheckinSelectedByUser() {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var f = getMyForm();
    if (f.CIDay.value != -1 || f.CIMonth.value != -1) {
        checkInSelectedByUser = true;
    } else {
        checkInSelectedByUser = false;
    }
}


function selectCheckInDateBasedOnCheckOutDate() {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
/*
    if (document.forms[0].name == "myform") {
        var f = document.forms[0];
    } else {
        var f = document.forms[1];
    }
    var newMonth;
    var newDay;
    var newYear;

    if (!checkInSelectedByUser && f.CODay.value != -1 && f.COMonth.value != -1) {
        var ciDate = new Date(f.COYear.value, f.COMonth.value-1, f.CODay.value, 0, 0, 0);
        with (ciDate) {
            setDate(getDate() - determineDefaultLengthOfStay());
            newDay = getDate();
            newMonth = getMonth() + 1;
            newYear = getFullYear();
        }
        
        f.CIYear.value = newYear;
        doSelectMonth(newMonth + "", newYear + "", f.CIMonth.options); 
        updateDaysInMonth('CIDay','CIMonth', 'CIYear');
        f.CIDay.value = newDay;
        if (f.CIDay.value != newDay) {
            if (newDay < f.CIDay.options[1].value) {
                f.CIDay.selectedIndex = 1;
            } else {
                var lastValue = f.CIDay.options[f.CIDay.options.length-1].value;
                if (newDay > lastValue) {
                    f.CIDay.value = lastValue;
                }
            }
        }
        showDayOfWeek('CIDay','CIMonth','CIYear','CIDowArea');
    }*/
}


function selectCheckInDateBasedOnCheckOutDateDynamic(diwArea) {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    /*
    if (document.forms[0].name == "myform") {
        var f = document.forms[0];
    } else {
        var f = document.forms[1];
    }
    var newMonth;
    var newDay;
    var newYear;

    if (!checkInSelectedByUser && f.CODay.value != -1 && f.COMonth.value != -1) {
        var ciDate = new Date(f.COYear.value, f.COMonth.value-1, f.CODay.value, 0, 0, 0);
        with (ciDate) {
            setDate(getDate() - determineDefaultLengthOfStay());
            newDay = getDate();
            newMonth = getMonth() + 1;
            newYear = getFullYear();
        }
        
        f.CIYear.value = newYear;
        doSelectMonth(newMonth + "", newYear + "", f.CIMonth.options); 
        updateDaysInMonth('CIDay','CIMonth', 'CIYear');
        f.CIDay.value = newDay;
        if (f.CIDay.value != newDay) {
            if (newDay < f.CIDay.options[1].value) {
                f.CIDay.selectedIndex = 1;
            } else {
                var lastValue = f.CIDay.options[f.CIDay.options.length-1].value;
                if (newDay > lastValue) {
                    f.CIDay.value = lastValue;
                }
            }
        }
        showDayOfWeek('CIDay','CIMonth','CIYear',diwArea);
    }*/
}




function selectCheckOutDateBasedOnCheckInDate() {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var f = getMyForm();
    var newMonth;
    var newDay;
    var newYear;

    if (!checkOutSelectedByUser && f.CIDay.value != -1 && f.CIMonth.value != -1) {
        var coDate = new Date(f.CIYear.value, f.CIMonth.value-1, f.CIDay.value, 0, 0, 0);
        with (coDate) {
            setDate(getDate() + determineDefaultLengthOfStay());
            newDay = getDate();
            newMonth = getMonth() + 1;
            newYear = getFullYear();
        }
        
        f.COYear.value = newYear;
        doSelectMonth(newMonth + "", newYear + "", f.COMonth.options); 
        updateDaysInMonth('CODay','COMonth', 'COYear');
        f.CODay.value = newDay;
        if (f.CODay.value != newDay) {
            if (newDay < f.CODay.options[1].value) {
                f.CODay.selectedIndex = 1;
            } else {
                var lastValue = f.CODay.options[f.CODay.options.length-1].value;
                if (newDay > lastValue) {
                    f.CODay.value = lastValue;
                }
            }
        }
        showDayOfWeek('CODay','COMonth','COYear','CODowArea');
    }
}

function selectCheckOutDateBasedOnCheckInDateDynamic(dowArea) {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var f = getMyForm();
    var newMonth;
    var newDay;
    var newYear;

    if (!checkOutSelectedByUser && f.CIDay.value != -1 && f.CIMonth.value != -1) {
        var coDate = new Date(f.CIYear.value, f.CIMonth.value-1, f.CIDay.value, 0, 0, 0);
        with (coDate) {
            setDate(getDate() + determineDefaultLengthOfStay());
            newDay = getDate();
            newMonth = getMonth() + 1;
            newYear = getFullYear();
        }
        
        f.COYear.value = newYear;
        doSelectMonth(newMonth + "", newYear + "", f.COMonth.options); 
        updateDaysInMonth('CODay','COMonth', 'COYear');
        f.CODay.value = newDay;
        if (f.CODay.value != newDay) {
            if (newDay < f.CODay.options[1].value) {
                f.CODay.selectedIndex = 1;
            } else {
                var lastValue = f.CODay.options[f.CODay.options.length-1].value;
                if (newDay > lastValue) {
                    f.CODay.value = lastValue;
                }
            }
        }
        showDayOfWeek('CODay','COMonth','COYear',dowArea);
    }
}

function showDayOfWeek(day, month, year, dowArea) {
    //forms hack for IE, property page has 2 forms now and requires a lot of tinkering
    var f = getMyForm();
    var d = eval("f." + day + ".value" );
    var m = eval("f." + month + ".value - 1" );
    var y = eval("f." + year + ".value" );
    var div = document.getElementById(dowArea);
    var dow = determineDayOfWeek(d, m, y);
    if (dow > -1) {
        div.innerHTML = WEEKDAYS_THREE[dow];
    } else {
        div.innerHTML = "";
    }
}

function determineDayOfWeek(d, m, y) {
    var ys = "" + y;
    if(ys.length == 4) {
        var c = new Date(y, m, d);
        if ((c.getDate() == d) && (c.getMonth() == m) && (c.getFullYear() == y)) {
            return c.getDay();
        }
    }

    return -1;
}

function doSelectMonth(theMonth, theYear, opts) {
    for (var i=0; i< opts.length; i++) {
        if (opts[i].value != theMonth) {
            opts[i].selected = false;
        }
        else {
            var col = opts[i].text.length - new String(theYear).length;
            if (col < 0) {
                opts[i].selected = false;
            }
            else {
                opts[i].selected = opts[i].text.substr(col) == theYear;
            }
        }
    }
}

function selectDate(date, type) {
	var f = getMyForm();
	if (type == "ci") {
		f.CIMonth.value = date.getMonth() + 1;
		f.CIYear.value = date.getFullYear();
		//updateDaysInMonth('CIDay','CIMonth', 'CIYear');
		f.CIDay.value = date.getDate();
	} else {
		f.COMonth.value = date.getMonth() + 1;
		f.COYear.value = date.getFullYear();
		//updateDaysInMonth('CODay','COMonth', 'COYear');
		f.CODay.value = date.getDate();
	}
}
