// Need this for JQuery intellisense
/// <reference path="../../jQuery/1.3.2/jquery-1.3.2-vsdoc.js" />
/**
* @author EPotapova and MJJames
*/


NewMind.registerNameSpace("NewMind.SlfCatAvailUI");

NewMind.SlfCatAvailUI = function () {
	var objSlfCatCalAvailUI;
	var objSlfCatCal;
	var objAvailStays = {};
	var strBookPostUrl = '';
	//Set the sitebuilder ajax url as default
	//will be overriden it in Init() for ETWP 
	var sBaseUrl = '/sitebuilder/ajax/slfcatavailcal.asp';
	//ETWP partilal render control key list
	var sPartRenderCtlList = '';
	NewMind.SlfCatAvailUI.ChildPricingEnabled = false;

	var initSlfCatUI = function () {
		initNextPrevMonthLinks();
		initBookableStayLinks();
		initAvailSearchForm();
	};

	var reinitSlfCatUI = function () {
		initNextPrevMonthLinks();
		initBookableStayLinks();
	};

	var updateSlfCatUI = function (sUrl, objToUpdate, bReInitUI, e) {
		//alert(objToUpdate.attr('class'));
		//tidy up the url, remove all appart from query string variables
		sUrl = sUrl.substring(sUrl.indexOf("?"), sUrl.length);
		$.get(sBaseUrl + sUrl + sPartRenderCtlList, {}, function (data) {
			objToUpdate.html(data);
			if (bReInitUI) { reinitSlfCatUI(); }
			if (objToUpdate.attr('id') === 'SelectedStaySummary') {
				//ensure the action is set on the booking form
				objToUpdate.find('form.FrmUnitOptions').attr('action', strBookPostUrl);
			}
		});
	};

	// Update requirement summary generated by RequirementSummary control
	// Applicable to ETWP only
	var updateRequirementSummary = function (objSearchForm) {
		var reqSummary = $('div.ctl_RequirementSummary  dl#reqsummary');
		if (reqSummary.length > 0) {

			var iNights = parseInt(objSearchForm.find('select#nights').attr('value'), 10);
			reqSummary.find('dd#nonights').text(iNights);

			var sArrivalDate = objSearchForm.find('input#isostartdate').attr('value');
			var dayfield = sArrivalDate.split("/")[0];
			var monthfield = sArrivalDate.split("/")[1];
			var yearfield = sArrivalDate.split("/")[2];
			var d = new Date(yearfield, monthfield - 1, dayfield);

			reqSummary.find('dd#arrivaldate').text(d.toDateString());
			d.setDate(d.getDate() + iNights);
			reqSummary.find('dd#departuredate').text(d.toDateString());
			//for child pricing getting our adults and children requirements is a bit different
			if (NewMind.SlfCatAvailUI.ChildPricingEnabled) {
				var adults = 0;
				//jQuery's .val only gives us the first unit's value so instead we spin through each input and add the number to our variable, thus a running count
				objSearchForm.find(".adults select").each(function () { adults += Number($(this).val()); });
				var children = 0;
				objSearchForm.find(".children select").each(function () { children += Number($(this).val()); });
				var childages = [];
				objSearchForm.find(".childagefield select:visible").each(function () { childages.push(Number($(this).val())); });
				//now we have our values assign them
				reqSummary.find("dd.noadults").text(adults);
				reqSummary.find("dd.nochildren").text(children);
				reqSummary.find("dd.childages").text(childages.join(","));
			}
		}
	};

	var initNextPrevMonthLinks = function () {
		//alert(objSlfCatCal.find('div.SC_CalNavLinks a').length);
		objSlfCatCal.find('div.SC_CalNavLinks a').one('click', function (e) {
			e.preventDefault();
			//alert('next'+'div.'+$(this).attr('class'));
			var objCal = objSlfCatCal.find('div.' + $(this).attr('class'));
			if (objCal.css('display') === 'none') {
				objCal.show();
			}
			else {
				updateSlfCatUI($(this).attr('href'), objSlfCatCalAvailUI.find('div.SlfCatAvailCalWrapper'), true, e);
			}

		});
	};

	var initAvailSearchForm = function () {

		if (NewMind.SlfCatAvailUI.ChildPricingEnabled) {
			initChildPricing();
		}

		$('div.SlfCatAvailUI form#SC_CalendarForm').submit(function (e) {
			e.preventDefault();
			//default the url
			var sUrl = '?';
			//stash our form
			var $form = $(this);


			//if child pricing is enabled then our form values were serialized as _adults _children, selfcat won't know what to do with these
			if (NewMind.SlfCatAvailUI.ChildPricingEnabled) {
				var loopCounter = 0;
				var validGuestRequirement = false;

				//find each unit
				$form.find(".roomsReqRow").each(function () {
					//for each unit find the adults number
					var $this = $(this);
					var $adults = $find(".adults select");
					var guests = Number($adults.val());
					//our form id is the adults id with _adults removed
					var fieldid = $adults.attr("id").replace("_adults", "");

					//if we have a children element and it's not disabled
					var $children = $find(".children select:not(:disabled)");
					var ages = [];
					if ($children.length > 0) {
						//then append the number of children
						guests += Number($children.val());
						$find(".childagefield select:visible").each(function () {
							ages.push($(this).val());
						});
					}

					if (guests > 0) {
						validGuestRequirement = true;
						if (sUrl !== "?") {
							sUrl += "&";
						}
						//finally add this form value to the url
						sUrl += fieldid + "=" + guests;
						if (ages.length > 0) {
							sUrl += "&" + fieldid + "_childages=" + ages.join(",");
						}
					}

					loopCounter++;

				});
				if (!validGuestRequirement) {
					alert("Please Ensure You Have Provided Guest Requirements Before Searching");
					return;
				}
				if (loopCounter > 0) {
					sUrl += "&";
				}
				sUrl += $form.find("select#nights,input:not(.roomsReqRow input)").serialize();
			}
			else {
				//serialize our form values
				sUrl += $form.serialize();
			}
			updateSlfCatUI(sUrl, objSlfCatCalAvailUI.find('div.SlfCatAvailCalWrapper'), true, e);
			updateRequirementSummary($(this));
		});
	};

	var initBookableStayLinks = function () {
		var objAvailStayTDs = objSlfCatCal.find('td.i,td.a');
		//alert('objTds.length = '+objTds.length);
		var objAvailStayStartTDs = objSlfCatCal.find('td.i:has(a),td.a:has(a)');
		var objAvailStmtTDs = objSlfCatCal.find('td.availstmt_week');
		var objSelectedStayDetails = objSlfCatCal.find('div#SelectedStaySummary');
		var objSummary;

		var getWeekAvailStmtData = function (obj) {
			//alert(objStayLink);
			var sDate = obj.attr('id').replace('AvailStmt_', '');
			var objWeekAvailStmtData = objAvailStays.WeekAvailStmtData;
			var objThisWeekAvailStmt;
			for (var i = 0, n = objWeekAvailStmtData.length; i < n; ++i) {
				if (objWeekAvailStmtData[i].isostartdate === sDate) {
					objThisWeekAvailStmt = objWeekAvailStmtData[i];
					break;
				}
			}
			//alert(objThisWeekAvailStmt.isostartdate);
			return objThisWeekAvailStmt;
		};

		var getStayData = function (objStayLink) {
			//alert(objStayLink);
			var sDate = objStayLink.attr('id').replace('Stay_', '');
			var objAvailStaysData = objAvailStays.AvailStaysData;
			var objThisStayData;
			for (var i = 0, n = objAvailStaysData.length; i < n; ++i) {
				if (objAvailStaysData[i].isostartdate === sDate) {
					objThisStayData = objAvailStaysData[i];
					break;
				}
			}
			//alert(objThisStayData.nights);
			return objThisStayData;
		};

		objAvailStayStartTDs.click(function (e) {
			e.preventDefault();
			$('td.selected').removeClass('selected');
			$(this).addClass('selected');
			if (objSummary.length > 0) {
				objSummary.remove();
			}
			var objLink = $(this).find('a');
			if (objLink.length > 0) {
				var objThisStayData = getStayData(objLink);
				var sUrl = objLink.attr('href');
				updateStaySummary(sUrl, objThisStayData, e);
			}

		});

		objAvailStmtTDs.hover(
			function (e) {
				var objThisWeekAvailStmtData = getWeekAvailStmtData($(this));
				var sSummary = buildSummary(objThisWeekAvailStmtData, true, e);
				drawSummary(sSummary, this, e);
			},
			function (e) { }
		);

		objAvailStayStartTDs.hover(
			function (e) {

				$('td.highlighted').removeClass('highlighted');
				var objLink = $(this).find('a');
				var objThisStayData = getStayData(objLink);
				var sSummary = buildSummary(objThisStayData, false, e);

				//sSummary = '<span class="title">Available stay 3 nights for £69.00</span><span class="staydates">Saturday, 9th May 2009 - Tuesday, 12th May 2009</span><span class="unitname">Blue Cottage (£23.00 per room/unit per night)</span>';

				drawSummary(sSummary, this, e);

				var iNights = parseInt(objThisStayData.nights, 10);
				var iCount = 0;
				for (var i = 0, n = objAvailStayTDs.length; i < n; ++i) {
					//$(objAvailStayTDs[i]).removeClass('highlighted');

					if (objAvailStayTDs[i] === this) { iCount = 1; }
					if ((iCount >= 1) && (iCount <= iNights)) {
						$(objAvailStayTDs[i]).addClass('highlighted');
						iCount = iCount + 1;
					}
					if (iCount > iNights) { break; }
				}


			},
			function (e) { }
		);

		var highlightStay = function (objItems, iQty, sClass) {
			var iCount = 0;
			for (var i = 0, n = objAvailStayTDs.length; i < n; ++i) {
				//$(objAvailStayTDs[i]).removeClass('highlighted');

				if (objAvailStayTDs[i] === this) {
					iCount = 1;
				}
				if ((iCount >= 1) && (iCount <= iNights)) {
					$(objAvailStayTDs[i]).addClass('highlighted');
					iCount = iCount + 1;
				}
				if (iCount > iNights) {
					break;
				}
			}
		};
		var buildSummary = function (objStayData, bAvailStmt, e) {
			var objUnitData = objStayData.unitdata;
			var sUnitName = '';
			var sAvailStatement = '';

			for (var i = 0, n = objUnitData.length; i < n; ++i) {
				sUnitName = sUnitName + '<span class="unitname">' + objUnitData[i].unitname;
				if (bAvailStmt) {
					//MJ -	bit of a scam.... the avail statement could have encoded entities, like £ which is &#163 , but the & has been encoded into &amp;
					//		we need to decode this and any other entities so use jquery to create a fake element, set it's html and get the text out
					//		crazy but it works
					sUnitName = sUnitName + ' - ' + $("<div />").html(objUnitData[i].unitavailstmt).text();
				}
				if (i < n - 1) {
					sUnitName = sUnitName + '<br/>';
				}
				sUnitName = sUnitName + '</span>';

			}

			var sSummary = '';
			var sTittle = '';
			if (bAvailStmt) {
				sTittle = 'Availability information:';
			}
			else {
				sTittle = 'Available stay: ';
				var sNights = objStayData.nights;
				var sPrice = objStayData.price;
				if ((sNights !== undefined) && (sPrice !== undefined)) { sTittle = sTittle + ' ' + sNights + ' nights for ' + sPrice; }

			}
			sSummary = sSummary + '<span class="title">' + sTittle + '</span>';

			var sIsoStartDate = objStayData.isostartdate;
			var sAvailType = objStayData.availtype;

			var sNiceStayDates = objStayData.nicestaydates;
			if (sNiceStayDates !== undefined) { sSummary = sSummary + '<span class="staydates">' + sNiceStayDates + '</span>'; }
			sSummary = sSummary + sUnitName;

			return sSummary;
		};


		var drawSummary = function (sSummary, objThis, e) {
			objSummary = $('body > div#SlfCatStaySummary');
			if (objSummary.length === 0) {
				objSummary = $('<div id="SlfCatStaySummary">' + sSummary + '</div>');
				$('body').append(objSummary);
			}
			else {
				objSummary.html(sSummary);
			}

			//use jquery to get our offset's
			var $offset = $(objThis).offset();
			
			var iOffSetTop = $offset.top;
			var iOffSetLeft = $offset.left;

			objSummary.css('position', 'absolute');
			objSummary.css('top', (iOffSetTop + 17) + 'px');
			objSummary.css('left', (iOffSetLeft + 9) + 'px');

			$('body').children().one('click', function (e) {
				if ($(this).attr('id') !== objSummary.attr('id')) {
					objSummary.remove();
				}
			});
			objSummary.one('click', function (e) {
				$(this).remove();
			});

		};

		var updateStaySummary = function (sUrl, objThisStayData, e) {
			if (objSelectedStayDetails.length === 0) {
				objSelectedStayDetails = $('<div id="SelectedStaySummary"></div>');
				objSelectedStayDetails.insertBefore(objSlfCatCal.find('div.SC_Product'));
				objSelectedStayDetails.hide();
				updateSlfCatUI(sUrl, objSelectedStayDetails, false, e);
				objSelectedStayDetails.slideDown("slow");
			} else {
				//alert(objSelectedStayDetails.length);
				var objStayPrice = objSelectedStayDetails.find('dd.stayprice');
				objStayPrice.html(objThisStayData.price);
				var objStayDates = objSelectedStayDetails.find('dd.staydates');
				objStayDates.html(objThisStayData.nicestaydates);
				var objIsostartdateInput = objSelectedStayDetails.find('input[name="isostartdate"]');
				objIsostartdateInput.attr('value', objThisStayData.isostartdate);

				//Update Bookable
				var objBookable = objSlfCatCalAvailUI.find('div.pnStayButtons');
				var bBookButtonPresent = objBookable.find('input.btnBookStay').length > 0;
				//alert('objThisStayData.bookable = ' + objThisStayData.bookable + ' bBookButtonPresent' + bBookButtonPresent);

				if (objThisStayData.bookable === 'True' && !bBookButtonPresent) {
					objBookable.html(String(objAvailStays.BookBtn));
				} else if (objThisStayData.bookable === 'False' && bBookButtonPresent) {
					objBookable.html(String(objAvailStays.TeleBookMessage));
				}
			}


		};

	};

	var initChildPricing = function () {
		var $roomReqs = $(".roomsReqRow");
		var $adults = $roomReqs.find(".adults select");
		var maxPeople = $adults.find("option:last").val();
		var adults = $adults.change(function (e) {
			var $element = $(this);
			var adults = Number($element.val());
			//if our adults value is set to less than the maximum occupants we can allow the user to select children
			//otherwise disable the children control
			if (adults < maxPeople) {
				adultsValueChanged($element, maxPeople);
			}
			else {
				$element.closest(".roomsReqRow").find(".children select").attr("disabled", "disabled");
			}
		}).val();

		if (adults < maxPeople) {
			adultsValueChanged($adults, maxPeople);
		}
		//if we have already done a search and our adults are the same as the max occupancy disable the ability to add children
		if (adults === maxPeople) {
			$roomReqs.find(".children select").attr("disabled", "disabled");
		}

		setupChildAges($roomReqs);

	};

	var adultsValueChanged = function ($element, maxPeople) {
		var adults = Number($element.val());
		var $children = $element.closest(".roomsReqRow").find(".children select");
		$children.removeAttr("disabled");
		//although the children can now be selected, disable any options which would mean we have more children and adults than the room allows
		var $options = $children.find("option").each(function () {
			var $this = $(this);
			if (Number($val()) > (maxPeople - adults)) {
				//if we are already selected remove the selected attribute AND make the first of our siblings selected - usually 0 
				if ($attr("selected")) {
					$removeAttr("selected");
					$siblings().eq(0).attr("selected", "selected");
				}
				$attr("disabled", "disabled");
			}
			else {
				$removeAttr("disabled");
			}
		});
	};

	var setupChildAges = function ($containerSelector) {
		//find our children field
		var $childrenField = $containerSelector.find(".children select");
		//bind our change event
		$childrenField.change(function (e) {
			var $this = $(this);
			var value = $val();
			//call showhideAgeFields passing our values
			showhideAgeFields($this, value);

		});
		//hide the children age labels and wrappers
		$childrenField.parent().siblings("span.childrenageslabel").hide().siblings("span.childrenagesfield").find("span.childageWrapper").hide();
		//we now need to call showhideAgeFields to ensure any children we have already specified show
		$childrenField.each(function () {
			var $this = $(this);
			showhideAgeFields($this, $val());
		});
	};

	var showhideAgeFields = function ($this, value) {
		$parent().siblings("span.childrenageslabel").hide().siblings("span.childrenagesfield").find("span.childageWrapper").hide().each(function (i) {
			if (!isNaN(value) && i < Number(value)) {
				$(this).show().parent().siblings("span.childrenageslabel").show();
			}
		});
	};

	return {

		Init: function (sBookPostUrl) {
			objSlfCatCal = $('div.SlfCatAvailCalWrapper');
			objSlfCatCalAvailUI = $('div.SlfCatAvailUI');
			strBookPostUrl = sBookPostUrl;
			if (objSlfCatCalAvailUI.parent().hasClass('SlfCatAvailUIWrapper')) {
				sBaseUrl = '';
				var sCtlKey = objSlfCatCalAvailUI.parent().attr('id').replace('c', '');
				sPartRenderCtlList = '&PartialRenderType=data&PartialRenderControlList=' + sCtlKey;
			}
			initSlfCatUI();
		},

		AvailStays: function (data) {
			objAvailStays = data;
		}
	};

} ();


//AddEventListener(window, 'load', NewMind.SlfCatAvailUI.Init);




