// 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 = $this.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 = $this.find(".children select:not(:disabled)");
					var ages = [];
					if ($children.length > 0) {
						//then append the number of children
						guests += Number($children.val());
						$this.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;
			for (var i = 0, n = objWeekAvailStmtData.length; i < n; ++i) {
				if (objWeekAvailStmtData[i].isostartdate === sDate) {
					var 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;
			for (var i = 0, n = objAvailStaysData.length; i < n; ++i) {
				if (objAvailStaysData[i].isostartdate === sDate) {
					var 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) {
	      		//$('td.highlighted').removeClass('highlighted');

	      	}
	    );

		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) {
					sUnitName = sUnitName + ' - ' + objUnitData[i].unitavailstmt;
				}
				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);
			}

			var iOffSetTop = AnchorPosition_getPageOffsetTop(objThis);
			var iOffSetLeft = AnchorPosition_getPageOffsetLeft(objThis);

			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($this.val()) > (maxPeople - adults)) {
				//if we are already selected remove the selected attribute AND make the first of our siblings selected - usually 0 
				if ($this.attr("selected")) {
					$this.removeAttr("selected");
					$this.siblings().eq(0).attr("selected", "selected");
				}
				$this.attr("disabled", "disabled");
			}
			else {
				$this.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 = $this.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, $this.val());
		});
	};

	var showhideAgeFields = function($this, value) {
		$this.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);



