﻿function ClearSelection() {
	$.cookie("BookingUserSelections", null);
	$.cookie("BookingUserCode", null);
	$.cookie("BookingUserUpgrades", null);
}

function OfferClicked(offerID, offerDate, minNights, maxNights) {
	//Get vals
	var lookup = new Hashtable();
	var cookieval = $.cookie("BookingUserSelections");
	if (cookieval) lookup.deserialise(cookieval);
	var thisDate = new Date();
	thisDate.setTime(Date.parse(offerDate));
	var rangeInfo = OfferRange(lookup, offerID, thisDate);
	
	//Check maximum quantity rule
	if (maxNights != null && rangeInfo.Nights > maxNights) {
		alert("You may only select a maximum of "+maxNights+" consecutive nights for this room.\nPlease contact us if you would like more information.");
		return false;
	}

	//Toggle selected day
	var wasAdded = SetNight(lookup, offerID, offerDate, 2);
	if (wasAdded == null) return false;

	//Check minimum quantity rule
	if (minNights != null && minNights > 1) {
		if (wasAdded && rangeInfo.Nights < minNights) {
			var newDate = new Date();
			newDate.setTime(rangeInfo.EndDate);
			newDate.setDate(newDate.getDate() + 1);
			for (var i = rangeInfo.Nights; i < minNights; i++) {
				SetNight(lookup, offerID, GetDateStr(newDate), 1);
				newDate.setDate(newDate.getDate() + 1);
			}
		}
		else if (!wasAdded) {
			var f = function(testDate) {
				var range = OfferRange(lookup, offerID, testDate);
				if (range.Nights < minNights) {
					var newDate = new Date();
					newDate.setTime(range.StartDate);
					for (var i = 0; i < range.Nights; i++) {
						SetNight(lookup, offerID, GetDateStr(newDate), 0);
						newDate.setDate(newDate.getDate() + 1);
					}
				}
			}
			//Check left side of split
			var testDate = new Date();
			testDate.setTime(thisDate.getTime());
			testDate.setDate(thisDate.getDate() - 1);
			f(testDate);
			
			//Check right side of split
			testDate.setTime(thisDate.getTime());
			testDate.setDate(thisDate.getDate() + 1);
			f(testDate);
		}
	}

	//Check discounting display
	CheckDiscounts(lookup, offerID, offerDate, wasAdded);
	
	//Re-store
	$.cookie("BookingUserSelections", lookup.serialise());
	
	return true;
}

function LoadDiscounts() {
	var lookup = new Hashtable();
	var cookieval = $.cookie("BookingUserSelections");
	if (cookieval) lookup.deserialise(cookieval);

	//Check discounting display
	for (var offerDate in lookup._storage) {
		var offerArray = lookup._storage[offerDate];
		if (offerArray == null) continue;
		for (var i = 0; i < offerArray.length; i++)
			CheckDiscounts(lookup, offerArray[i][0], offerDate, true);
	}

	//Re-store
	$.cookie("BookingUserSelections", lookup.serialise());

}

function CheckDiscounts(lookup, offerID, offerDate, wasAdded) {
	var tickbox = document.getElementById("offer" + offerID + "_" + offerDate.toString().replace(/\//g, ""));
	if (!tickbox) return;
	var obj = null;
	eval("obj = "+tickbox.getAttribute("discountInfo")+";");
	if (!obj) return;

	var thisDate = new Date();
	thisDate.setTime(Date.parse(offerDate));
	
	var disPer = obj.Per;
	var disFree = obj.Free;
	var disAmount = obj.Amount;
	
	if (disPer != null) {
		var rangeProc = function(range) {
			var newDate = new Date();
			newDate.setTime(range.StartDate);
			var dayCounter = 0;
			var daySum = 0;
			var nightCounter = 0;
			for (var i = 0; i < range.Nights; i++) {

				var span = document.getElementById("offeramnt" + offerID + "_" + GetDateStr(newDate).replace(/\//g, ""));
				if (span == null) continue;
				var amnt = parseFloat(span.getAttribute("origamnt"));

				if (nightCounter > 0) {
					span.innerHTML = "FREE";
					nightCounter--;
				}
				else {
					dayCounter++;
					daySum += amnt;

					if (dayCounter == disPer) {
						dayCounter = 0;
						if (disFree != null) {
							span.innerHTML = "FREE";
							nightCounter = disFree - 1;
						} else if (disAmount != null) {
							span.innerHTML = FormatRate(amnt - (daySum * (disAmount / 100)));
						}
						daySum = 0;
					}
					else
						span.innerHTML = FormatRate(amnt);
				}

				newDate.setDate(newDate.getDate() + 1);
			}
		}

		if (wasAdded) {
			rangeProc(OfferRange(lookup, offerID, thisDate));
		}
		else {
			//Check left side of split
			var testDate = new Date();
			testDate.setTime(thisDate.getTime());
			testDate.setDate(thisDate.getDate() - 1);
			rangeProc(OfferRange(lookup, offerID, testDate));

			//Check right side of split
			testDate.setTime(thisDate.getTime());
			testDate.setDate(thisDate.getDate() + 1);
			rangeProc(OfferRange(lookup, offerID, testDate));
		}
	}
}

function GetDateStr(dateObj) {
	var year = dateObj.getFullYear();
	var month = (dateObj.getMonth()+1).toString(); //0-11
	var day = dateObj.getDate().toString();
	return year+"/"+
			(month.length==1?"0":"")+month+"/"+
			(day.length==1?"0":"")+day;
}

function SetNight(table, offerID, offerDate, setTo) {
	//SetTo = 0 for off, 1 for on, 2 for user toggled
	//Returns new status (false for removed/off, true for added/on) or null if "user toggled" and should be cancelled
	
	//Get offer dates
	var offerArray = table.get(offerDate);
	if (offerArray == null) offerArray = [];
	var offerIdx = -1;
	for (var i = 0; i < offerArray.length; i++) if (offerArray[i][0] == offerID) { offerIdx = i; break; }

	//Set status
	if (setTo == 0 && offerIdx == -1) return false;
	if (setTo == 1 && offerIdx != -1) return true;
	var ret = false;
	if (offerIdx == -1) {
		if (setTo == 2 && offerArray.length == 3) {
			alert("You already have selected three rooms for this date.\nIf you require more than 3 rooms, please contact us about a group booking.");
			return null;
		}
		offerArray.push([offerID, 1, 1, 0, "Queen"]); //offerid,quantity,adults,kids,bedding
		ret = true;
	}
	else {
		offerArray.splice(offerIdx, 1);
		ret = false;
	}
	table.add(offerDate, offerArray.length == 0 ? null : offerArray);
	if (setTo != 2) {
		var tickbox = document.getElementById("offer" + offerID + "_" + offerDate.toString().replace(/\//g, ""));
		if (tickbox) tickbox.checked = ret;
	}
	//Ensure any 'discounted rate' displayed is returned to normal
	if (!ret) {
		var span = document.getElementById("offeramnt" + offerID + "_" + offerDate.toString().replace(/\//g, ""));
		var amnt = parseFloat(span.getAttribute("origamnt"));
		span.innerHTML = FormatRate(amnt);
	}
	return ret;
}

function FormatRate(amnt)
{
	var srcstr = Math.round(amnt).toString();
	var outstr = "";
	for (var i = srcstr.length - 1; i >= 0; i--) {
		outstr = srcstr.charAt(i) + ((outstr != "" && ((srcstr.length - 1 - i) % 3) == 0) ? "," : "") + outstr;
	}
	return "$"+outstr;
}

function OfferRange(table, offerID, offerDate) {
	//offerDate is expected to be a REAL date object
	//returns {Start:datestr, StartDate:date, End:datestr, EndDate:date, Nights:int}
	//Note - this will include the target date as part of the range, regardless of if it's currently on or off
	var testDate = new Date();
	var returnObj = { Start: offerDate, StartDate: new Date(), End: offerDate, EndDate: new Date(), Nights: 1 };
	returnObj.StartDate.setTime(offerDate.getTime());
	returnObj.EndDate.setTime(offerDate.getTime());
	//Check to the left
	testDate.setTime(offerDate.getTime());
	testDate.setDate(testDate.getDate()-1);
	while (HasOfferOnDate(table, offerID, GetDateStr(testDate))) {
		returnObj.Start = GetDateStr(testDate);
		returnObj.StartDate.setTime(testDate.getTime());
		returnObj.Nights++;
		testDate.setDate(testDate.getDate() - 1);
	}
	//Check to the right
	testDate.setTime(offerDate.getTime());
	testDate.setDate(testDate.getDate() + 1);
	while (HasOfferOnDate(table, offerID, GetDateStr(testDate))) {
		returnObj.End = GetDateStr(testDate);
		returnObj.EndDate.setTime(testDate.getTime());
		returnObj.Nights++;
		testDate.setDate(testDate.getDate() + 1);
	}
	return returnObj;
}

function HasOfferOnDate(table, offerID, offerDate) {
	//Date should be a datestr in the format of yyyy/MM/dd
	var offerArray = table.get(offerDate);
	if (offerArray == null) return false;
	var offerIdx = -1;
	for (var i = 0; i < offerArray.length; i++) if (offerArray[i][0] == offerID) { offerIdx = i; break; }
	return offerIdx != -1;
}

function BookingNext() {
	//Store any code we're using to display special prices so it's persisted across the checkout screen
	var code = $.queryString("code");
	if (code != null && code != "") $.cookie("BookingUserCode", code);

	var cookieval = $.cookie("BookingUserSelections");
	if (!cookieval || cookieval == "")
		alert("You must select at least one night to stay to continue!");
	else
		window.location = '/Booking/Selected-Offers/';
	return false;
}

function OfferHotelClicked(offerID, offerDate, showDate, discountCode, propertyCode) {
	OfferClicked(offerID, offerDate);
	window.location = "/Booking/Offers/?" + propertyCode + "&date=" + encodeURIComponent(showDate) + "&code=" + encodeURIComponent(discountCode);
}

function BeddingChange(dropdown) {
	var tb = $("input", dropdown.parentNode);
	if (dropdown.options[dropdown.selectedIndex].value == "Other") tb.show();
	else tb.hide();
}
