//requires initialisation of the following variables:
//datesFrm (form with dates controls)
//curDay, curMonth (0-11), curYear
//bookPeriod (number of days allowed to book in advance)

if (typeof(monthArray) == "undefined")
	var monthArray = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

if (typeof(wkdArray) == "undefined")
	var wkdArray = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")

if (typeof(dateMask) == "undefined")
	dateMask = "d|m|y|-"


var objCookie

//instantialise and initialise cookie object
function initCookie() {
	objCookie = new cookieVal("", "", "", "", "")

	var cookieArray = URLDecode(document.cookie).split("|")

	for (var i=0; i<cookieArray.length; i++) {
		if (cookieArray[i] == "SearchEng2") {
			objCookie.country = cookieArray[i+2]
			objCookie.city = cookieArray[i+3]
			objCookie.suburb = cookieArray[i+4]
			objCookie.inDate = cookieArray[i+5]
			objCookie.outDate = cookieArray[i+6]

			break
		}
	}

	//if dates are present in the querystring, set them from there
	var qsInDate = GetQSVal("inDate")
	if (qsInDate != "") objCookie.inDate = qsInDate

	var qsOutDate = GetQSVal("outDate")
	if (qsOutDate != "") objCookie.outDate = qsOutDate
}


//populate and set select boxes
function populateDates() {
	//instantialise and initialise cookie object
	initCookie()

	//populate dates
	populateDate(datesFrm.inDate, new Date(curYear, curMonth, curDay - 1))  //start from yesterday - to consider the whole world times
	populateDate(datesFrm.outDate, new Date(curYear, curMonth, curDay))

	//set dafaults
	setVal(datesFrm.inDate, RemoveDateZeros(objCookie.inDate))
	setVal(datesFrm.outDate, RemoveDateZeros(objCookie.outDate))
	setWkd()
}


//remove leading zeros from canonically-formatted date elements
function RemoveDateZeros(dtStr) {
	var dtArr = dtStr.split("-")
	return Number(dtArr[0]) + "-" + Number(dtArr[1]) + "-" + Number(dtArr[2])
}


//populate date select box
function populateDate(ctl, startDate) {
	var optDate = new Date(startDate)

	//clear select box
	ctl.length = 0

	//populate select box
	for (var i=0; i<=bookPeriod; i++) {
		ctl[i] = new Option(formatDateText(optDate), formatDateVal(optDate))
		optDate.setDate(optDate.getDate() + 1)
	}

	ctl[0].selected = true
	ctl.selectedIndex = 0
}


//format date as specified in the dateMask (if provided) or put 'dd-mmm-yyyy' as default
function formatDateText(date) {
	var dateVal

	dateVal = date.getDate()
	if (dateVal < 10) dateVal = "0" + dateVal

	var arrMask = dateMask.split("|")

	var sTmpDate = dateMask.replace(/y/, date.getFullYear())
	sTmpDate = sTmpDate.replace(/m/, monthArray[date.getMonth()])
	sTmpDate = sTmpDate.replace(/d/, dateVal)
	sTmpDate = sTmpDate.replace(/\|/g, arrMask[3])

	if (arrMask[3] != "")
		sTmpDate = sTmpDate.substring(0, sTmpDate.length - 2)

	return sTmpDate
}


//format date as yyyy-mm-dd
function formatDateVal(date) {
	return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate()
}


//set select box value
function setVal(ctl, newVal) {
	for (var i=0; i<ctl.length; i++) {
		if (ctl[i].value == newVal) {
			ctl[i].selected = true
			ctl.selectedIndex = i
			break
		}
	}
}


//get select box value
function getVal(ctl) {
	return ctl[ctl.selectedIndex].value
}


//get select box's text
function getText(selBox) {
	return selBox[selBox.selectedIndex].text
}



//get date from the date select box
function getDateFromCtl(ctl) {
	var arrDate = getVal(ctl).split("-")
	return new Date(arrDate[0], arrDate[1] - 1, arrDate[2])
}


//set days of week and length of stay
function setWkd() {
	if (!datesFrm.inWkd) return

	var checkinDate = getDateFromCtl(datesFrm.inDate)
	var checkoutDate = getDateFromCtl(datesFrm.outDate)

	//set days of week
	datesFrm.inWkd.value = "(" + wkdArray[checkinDate.getDay()] + ")"
	datesFrm.outWkd.value = "(" + wkdArray[checkoutDate.getDay()] + ")"

	//set length of stay
	datesFrm.lenStay.value = Math.round((checkoutDate - checkinDate) / 86400000)
}


//reset out date to (in date + 1) if out date <= in date
function resetOutDate() {
	if (datesFrm.outDate.selectedIndex < datesFrm.inDate.selectedIndex) datesFrm.outDate.selectedIndex = datesFrm.inDate.selectedIndex
	DateChangeExtras()
}


//reset in date to (out date - 1) if in date >= out date
function resetInDate() {
	if (datesFrm.inDate.selectedIndex > datesFrm.outDate.selectedIndex) datesFrm.inDate.selectedIndex = datesFrm.outDate.selectedIndex
	DateChangeExtras()
}


//extra work that needs to be done when a date is changed
function DateChangeExtras() {

	//set weekdays and length of stay
	setWkd()
}


//cookie values object constructor
function cookieVal(country, city, suburb, inDate, outDate) {
	this.country = country
	this.city = city
	this.suburb = suburb
	this.inDate = inDate
	this.outDate = outDate
}


//save selected dates and location to cookie
function setSelCookie(country, city, suburb, inDate, outDate) {
	document.cookie = escape("|SearchEng|") + "=" + escape("|"
		+ country + "|" + city + "|" + suburb + "|"
		+ inDate + "|" + outDate + "|")
		+ ";path=/"
}


//reload page with new in/out dates
function changeDates() {
	//save new dates to the cookie
	setSelCookie(objCookie.country, objCookie.city, objCookie.suburb, getVal(datesFrm.inDate), getVal(datesFrm.outDate))

	//get new querystring
	var qString = location.search.substr(1)
	
	qString = setQStringName(qString, "inDate", new Array(getVal(datesFrm.inDate)))
	qString = setQStringName(qString, "outDate", new Array(getVal(datesFrm.outDate)))

	//do some extra work if dates are changed on the search results page
	if (datesFrm.ShowAll) {
		//set page to 1
		qString = setQStringName(qString, "page", new Array("1"))

		//set currencly selected search option
		for (var i = 0; 1 < datesFrm.ShowAll.length; i++) {
			if (datesFrm.ShowAll[i].checked) {
				var showAll = datesFrm.ShowAll[i].value
				break
			}
		}

		qString = setQStringName(qString, "ShowAll", new Array(showAll))
	}

	location = location.pathname + "?" + qString
}


//replace or add a name/value pairs in url-encoded querystring
function setQStringName(qString, name, arrVal) {
	var i
	var qStringNew = ""

	if (qString != "") {
		var curName
		var arrNameVal = qString.split("&")

		for (i in arrNameVal) {
			curName = arrNameVal[i].split("=")[0]
			curName = URLDecode(curName)
			if (curName.toLowerCase() != name.toLowerCase()) qStringNew += "&" + arrNameVal[i]
		}
	}

	for (i in arrVal) {
		qStringNew += "&" + escape(name) + "=" + escape(arrVal[i])
	}

	return qStringNew.substr(1)
}


//extract value from querystring for the passed name
function GetQSVal(qsName) {
	var qsPair
	var qsVal = ""
	var qString = location.search.substr(1)
	var arrNameVal = qString.split("&")

	for (var i in arrNameVal) {
		qsPair = arrNameVal[i].split("=")

		if (URLDecode(qsPair[0]) == qsName) {
			qsVal = URLDecode(qsPair[1])
			break
		}
	}

	return qsVal
}


//unencode url-encoded string
function URLDecode(urlStr) {
	return unescape(urlStr.replace(/\+/g, " "))
}


//info button redirection
function Info(htlID) {
	location = "/Hotel.asp?HotelID=" + htlID + "&inDate=" + GetQSVal("inDate") + "&outDate=" + GetQSVal("outDate")
}


//book button redirection
function Book(rtID) {
	location = "/Selections.asp?RoomTypeID=" + rtID + "&inDate=" + GetQSVal("inDate") + "&outDate=" + GetQSVal("outDate")
}


//reload search results page with the new querystring name-value pair
function Reload(name, val) {
	var qString = location.search.substr(1)
	qString = setQStringName(qString, "page", new Array("1"))  //always resert page to 1
	qString = setQStringName(qString, name, new Array(val.toString()))
	location = location.pathname + "?" + qString
}

