Hotels.SearchWidgets.RoomsGuest = Class.create();

YAHOO.extend(Hotels.SearchWidgets.RoomsGuest, Hotels.SearchWidgets.SearchWidget, {
	
	initialize: function(cfg) {
		this.type = "Hotels.SearchWidgets.RoomsGuest";
		this.numRooms = 1;
		
		if (typeof(cfg) == "undefined") cfg = new Object();
		cfg.inputNumRoomsId = 'refineRooms';

		if (!cfg.textAdultAgeTitle || cfg.textAdultAgeTitle == "")
		{
			cfg.textAdultAgeTitle = 'Adults (ages 19+)';
		} 
		if (!cfg.textChildAgeTitle || cfg.textChildAgeTitle == "") 
		{
			cfg.textChildAgeTitle = 'Children (ages 0-10)';
		}
		if (!cfg.textChildAge || cfg.textChildAge == "") 
		{
			cfg.textChildAge = 'Age of Child';
		}
		if (!cfg.textRoom || cfg.textRoom == "") 
		{
			cfg.textRoom = 'Room';
		}
		if (!cfg.textUnit || cfg.textUnit == "") 
		{
			cfg.textUnit = 'Unit';
		}
		
		Hotels.SearchWidgets.RoomsGuest.superclass.initialize.call(this,cfg);
		Hotels.SearchWidgets.onChangePropType.subscribe(function(type, args) {
			this.update();
		}, this, true);
		// YAHOO.util.Event.on(window,"load", this.init, this, true);
		YAHOO.util.Event.onDOMReady(this.init, this, true);
	},
	
	init: function() {
		var cfg = this.cfg;
		cfg.inputNumRooms = $(cfg.inputNumRoomsId);
		this.form = cfg.inputNumRooms.form;
		YAHOO.util.Event.on(cfg.inputNumRooms, "change", function() {
			this.update();
			// Hotels.ClickTrack.click("Rooms-Change");
		}, this, true);
		
		this.update();
		this.initInputs();
	},
	
	setSelectValue: function(field, value) {
		var o = field.options;
		for (var i = 0, len = o.length; i < len; i++) {
			if (o[i].value == value) {
				field.selectedIndex = i;
				break;
			}
		}
	},
	
	setRooms: function(rooms) {
		this.setSelectValue(this.cfg.inputNumRooms, rooms);
		this.update();
	},
	
	setRoomAdults: function(room, adults) {
		this.setSelectValue(this.form["adults["+room+"]"], adults);
		this.updateAdultChildDropdowns(room);
	},
	
	setRoomChildren: function(room, children) {
		var form = this.form;
		this.setSelectValue(form["child["+room+"]"], children.length);
		this.updateAdultChildDropdowns(room);
		for (var i = 0, len=children.length; i < len; i++) {
			this.setSelectValue(form["OIdx["+room+"].CAIdx["+i+"]"], children[i]);
		}
	},
	
	initInputs: function() {
		var form = this.form;
		for (var i = 0, len = this.cfg.maxRooms; i < len; i++) {
			YAHOO.util.Event.on(form["adults[" + i + "]"], "change", function(){
				Hotels.ClickTrack.click("Guest-Change");
			}, this, true);
			YAHOO.util.Event.on(form["child[" + i + "]"], "change", function() {
				this.update(); 
				Hotels.ClickTrack.click("Guest-Change");
			}, this, true);
		}
	},
	
	validate: function() {
		var errors = [];
		var form = this.form;
		for (var i = 0, len = this.numRooms; i < len; i++) {
			var childs = parseInt(form["child[" + i + "]"].value);
			if (childs > 0) {
				for (var j = 0; j < childs; j++) {
					var cai = form["OIdx["+i+"].CAIdx["+j+"]"].value;
					if (parseInt(cai) < 0) {
						errors.push("childAgeRequired");
					}
				}
			}
		}
		return errors;
	},
	
	updateAdultChildDropdowns: function (r) {
		var field = "adults[" + r + "]";
		var adults = this.form[field];
		
		// cache these lookups
		var thisRoomMinAdults = this.roomMinAdults;
		var thisRoomMaxGuests = this.roomMaxGuests;
		var thisRoomMaxChildren = this.roomMaxChildren;
		
		if (adults && adults.options && adults.options.length != this.maxGuest) {
			var selectedAdult = adults.value;
			if (selectedAdult > thisRoomMaxGuests || selectedAdult < thisRoomMinAdults) {
				selectedAdult = thisRoomMinAdults * 2;
			}
			adults.options.length = thisRoomMaxGuests - thisRoomMinAdults;
			var newSelectedIndex = 1;
			for (var i = thisRoomMinAdults; i <= thisRoomMaxGuests; ++i) {
				adults.options[i - thisRoomMinAdults] = new Option(i,i);
				if (i == selectedAdult) {
					newSelectedIndex = i - thisRoomMinAdults;
				}
			}
			adults.selectedIndex = newSelectedIndex;
		}
	       
		var children = this.form["child[" + i + "]"];
		if (children && children.options.length != thisRoomMaxChildren + 1) {
			var selectedChild = children.selectedIndex;
			if (selectedChild > thisRoomMaxChildren) {
				selectedChild = 0;
			}
			children.options.length = thisRoomMaxChildren + 1;
			for (i = 0 ; i <= thisRoomMaxChildren; ++i) {
				children.options[i] = new Option(i, i);
			}
			children.selectedIndex = selectedChild;
		}
	},
	
	displayElementForRoomType: function (title){
		
		// Cache this lookup
		var collectionElement = $("collect");
		
		var condoLabels = YAHOO.util.Dom.getElementsByClassName(title + ".condo", null, collectionElement);
		var hotelLabels = YAHOO.util.Dom.getElementsByClassName(title + ".hotel", null, collectionElement);
		var currentTypeLabels = YAHOO.util.Dom.getElementsByClassName(title + "." + this.roomType, null, collectionElement);
		
		if (parseInt(this.cfg.inputNumRooms.value) <= this.cfg.maxRooms) {
			for (var i = 0, len = condoLabels.length; i < len; i++) {
				condoLabels[i].style.visibility = 'visible';
				condoLabels[i].style.display = 'none';
			}
			
			for (var i = 0, len = hotelLabels.length; i < len; i++) {
				hotelLabels[i].style.visibility = 'visible';
				hotelLabels[i].style.display = 'none';
			}
		
			for (var i = 0, len=currentTypeLabels.length; i < len; i++) {
				currentTypeLabels[i].style.display = '';
			}
		} else {
			for (var i = 1, len=condoLabels.length; i < len; i++) {
				condoLabels[i].style.visibility = 'hidden';
			}
			
			for (var i = 1, len=hotelLabels.length; i < len; i++) {
				hotelLabels[i].style.visibility = 'hidden';
			}
			
		}
	},
	
	isGroup: function() {
		return (this.cfg.inputNumRooms.value > this.cfg.maxRooms);
	},
	
	update: function() {
		this.renderUi();
		this.selectRoomType();
		this.displayElementForRoomType("roomTitle");
		this.showRooms();
	},
	
	showRooms: function() {
		var form = this.form;
		this.numRooms = parseInt(this.cfg.inputNumRooms.value);
		var dispRooms = this.numRooms;
		
		var collectionElement = $("collect");
		var roomNumberSections = YAHOO.util.Dom.getElementsByClassName('roomNumber', 'div', collectionElement);
		var adultSections = YAHOO.util.Dom.getElementsByClassName('adults', 'div', collectionElement);
		var childrenSections = YAHOO.util.Dom.getElementsByClassName('children', 'div', collectionElement);
		
		if (this.numRooms > this.cfg.maxRooms) {
			
			// If thenumber of rooms selected is greater than the max number,
			// go into group mode (and hide all the num-adults / num-children bits)

			for (var i=0, len=roomNumberSections.length; i < len; i++)
			{
				roomNumberSections[i].style.display = "none";
			}
			
			for (var i=0, len=adultSections.length; i < len; i++)
			{
				adultSections[i].style.display = "none";
			}
		
			for (var i=0, len=childrenSections.length; i < len; i++)
			{
				childrenSections[i].style.display = "none";
			}
			
		} else {
			
			// Else if thenumber of rooms selected is less than than the max number,
			// go into regular mode (and show all the usual num-adults / num-children bits)
			
			for (var i=0, len=roomNumberSections.length; i < len; i++)
			{
				roomNumberSections[i].style.display = "block";
			}
			
			for (var i=0, len=adultSections.length; i < len; i++)
			{
				adultSections[i].style.display = "block";
			}
			
			for (var i=0, len=childrenSections.length; i < len; i++)
			{
				childrenSections[i].style.display = "block";
			}

			for (var i = 0, numRoomsLength=this.numRooms; i < numRoomsLength; i++) {
				this.updateAdultChildDropdowns(i);
				if (i < dispRooms) {
					var cid = "child[" + i + "]";
					var childs = parseInt(form[cid].value);
					$("room["+i+"]").style.display = "block";				
					for (var j = 0, maxChildrenLength=this.cfg.maxChildren + 1; j < maxChildrenLength; j++) {
						var caid = "OIdx["+i+"].CAIdx["+j+"]";
						var caidElement = $(caid);
						if (j < childs) {
							caidElement.style.display = "block";
							form[caid].disabled = false;
						} else {
							caidElement.selectedIndex = 0;
							caidElement.style.display = "none";
							form[caid].disabled = true;
						}
					}
					if (childs > 0) {
						YAHOO.util.Dom.removeClass( YAHOO.util.Dom.getAncestorByClassName($(cid), "childCount"), "noChildren" );
						$("child[" + i + "]-ages").style.display = "block";
					} else {
						YAHOO.util.Dom.addClass( YAHOO.util.Dom.getAncestorByClassName($(cid), "childCount"), "noChildren" );
						$("child[" + i + "]-ages").style.display = "none";
					}
				} else {
					$("room["+i+"]").style.display = "none";
				}
			}
		}
	},
	
	isTarget: function(evt) {
		var target = YAHOO.util.Event.getTarget(evt);
		return target == this.cfg.inputNumRooms 
			|| target == this.cfg.divGuest
			|| YAHOO.util.Dom.isAncestor(this.cfg.divGuest, target);
	},
	
	setMaxMin: function() {
		this.maxGuest = 0;
		this.minAdults = 100;
		var propInfo = this.cfg.propInfo;
		for (var i = 0, len = propInfo.length; i < len; i++) {
			var prop = propInfo[i];
			if ($(prop.nameKey) && $(prop.nameKey).checked) {
				if (this.maxGuest < prop.maxGuest) this.maxGuest = prop.maxGuest;
				if (this.minAdults > prop.minAdults) this.minAdults = prop.minAdults;
			}
		}
	},
		
	getBoxValue: function(box) {
		if (box.type == "hidden") {
			return "false" != box.value;
		} else {
			return box.checked;
		}
	},
	
	selectRoomType: function() {
		this.roomType = "hotel";
		this.roomMaxGuests = 8;
		this.roomMinAdults = 1;
		this.roomMaxChildren = 8;
		var form = this.form;
		
		if (form.isPropertyPage != null && form.isPropertyPage.value == "true") {
			if (form.isCondo != null && form.isCondo == "true") {
				this.roomMaxGuests = 16;
				this.roomType = "condo";
			} else {
				this.roomType = "hotel";
		    }
		} else {
			var box = form.allPropertyTypesSelected;
			var val;
			if (box) {
				val = this.getBoxValue(box);
				var propInfo = this.cfg.propInfo;
				if (val) {				
	           		for (var i = 0, len = propInfo.length; i < len; ++i) {
	           			if ("text.property.hotelPropertyType" == propInfo[i].nameKey 
	           				|| "text.property.resortPropertyType" == propInfo[i].nameKey) {
							this.roomType = "hotel";
							this.roomMaxGuests = propInfo[i].maxGuest;
							this.roomMinAdults = propInfo[i].minAdults;
							break;
						}
					}
				} else {
					var typeStop = false;
					for (var i = 0, len = propInfo.length; i < len; ++i) {
						box = $(propInfo[i].nameKey);
	               		if (box) {
	               			val = this.getBoxValue(box);
						if (val) {
								if (propInfo[i].type != "condo") {
									roomMinAdults = propInfo[i].minAdults;
									}
	                       
								if (!typeStop) {
									roomType = propInfo[i].type;
									if (roomType == "hotel") {
										typeStop = true;
									}
								}
	                       
								if (this.roomMaxGuests < propInfo[i].maxGuest) {
									this.roomMaxGuests = propInfo[i].maxGuest;
								}
							
								if (propInfo[i].type == "hotel" && this.roomMinAdults < propInfo[i].minAdults) {
									this.roomMinAdults = propInfo[i].minAdults;
								}
							}
						}
					}
				}
			}
		}
		if (form.isPropertyPage != null && form.isPropertyPage.value == "true") {
			if(form.isCondo != null &&  form.isCondo.value == "true") {
				this.roomType = "condo";
			} else {
				this.roomType = "hotel";
			}
		}
	},
	
	renderUi: function () {
		var rooms = parseInt(this.cfg.inputNumRooms.value);
		var roomGrids = YAHOO.util.Dom.getElementsByClassName("roomInput", "div", $("collect"));
		var roomGridsLength = roomGrids.length;
		if (roomGridsLength < rooms && rooms <= this.cfg.maxRooms) {
			// Make more room grids.
			this.addRoomGrids(roomGrids, rooms);
		} else if (roomGridsLength > rooms) {
			// Delete extra room grids.
			this.deleteRoomGrids(roomGrids, roomGridsLength - rooms);
		}
	},

	deleteRoomGrids: function(grids, count) {
		for (var i = grids.length - 1; i >= (grids.length - count); i--) {
			$('collect').removeChild(grids[i]);
		}
	},

	addRoomGrids: function(grids, rooms) {
		try 
		{
			var form = this.form;
			var cfg = this.cfg;
			var collect = $('collect');
			var gridsLength = grids.length;
		
			var propType = (form.isCondo != null &&  form.isCondo.value == "true") ? cfg.textUnit : cfg.textRoom;
		
			var adultsOptionsElementsMarkup;
			for (var j=1, len=cfg.maxAdults; j <= len; j++ ) 
			{	
				switch (j)
				{
					case 2:
						// Set the option for '2' to be initially selected by default
						adultsOptionsElementsMarkup += 		'<option value="2" selected="selected">2</option>';
						break;
						
					default:
						adultsOptionsElementsMarkup += 		'<option value="'+j+'">'+j+'</option>';
						break;
				}
	
			}
		
			var childrenOptionsElementsMarkup;
			for (var j=0, len=cfg.maxChildren + 1; j < len; j++) 
			{
				childrenOptionsElementsMarkup += 			'<option value="'+j+'">'+j+'</option>';
			}
		
			var childrenAgeOptionsElementsMarkup = '<option value="-1">--</option>';
			childrenAgeOptionsElementsMarkup += '<option value="0"><1</option>';
			for (var k = 1; k <= 18; k++) 
			{
				childrenAgeOptionsElementsMarkup += '<option value="' + k + '">' + k + '</option>';
			} // end of for-loop
		
		
			/* 
				Using an interim document.createDocumentFragment() can be faster than 
				adding elements one at a time:
				http://dev.opera.com/articles/view/efficient-javascript/?page=3#modifyingtree 
			*/
			var documentFragment = document.createDocumentFragment();
		
			for (var i = gridsLength; i < rooms; i++) {
			
				var grid = document.createElement("div");
				grid.id = "room["+i+"]";
				grid.className = "roomInput multiRoom clearFix";
			
				var html  = '<div class="inputWrap roomNumber">';		
					html += 	'<span>' + propType + ' ' + (i+1)+ '</span>';
					html += '</div>';
				
					html += '<div class="inputWrap adults">';
					html += 	'<label for="adults['+i+']">' + cfg.textAdultAgeTitle + '</label>';
					html += 	'<select name="adults['+i+']" id="adults['+i+']">';
					html +=			adultsOptionsElementsMarkup;
					html += 	'</select>';
					html += '</div>';
				
				var childId = 'child['+i+']';		
				
					html += '<div class="inputWrap children">';
					html += 	'<label for="' + childId + '">' + cfg.textChildAgeTitle + '</label>';
					html += 	'<span class="childCount noChildren">';
					html += 		'<select name="'+childId+'" id="'+childId+'" style="width: 40px;" title="Select the number of children">';
					html +=				childrenOptionsElementsMarkup;
					html += 		'</select>';
					html += 	'</span>';
			
					html += 	'<div id="'+childId+'-ages">';
				for (var j=0, len=cfg.maxChildren + 1; j < len; j++) {
					html += 		'<span class="ages" id="OIdx['+i+'].CAIdx['+j+']" >';
					html += 			'<label for="childAge-OIdx['+i+'].CAIdx['+j+']">' + cfg.textChildAge + ' ' + (j + 1) + ': </label>';
					html += 			'<select name="OIdx['+i+'].CAIdx['+j+']" id="childAge-OIdx['+i+'].CAIdx['+j+']" title="Select the age of the child" disabled>';
					html +=					childrenAgeOptionsElementsMarkup;
					html += 			'</select>';
					html += 		'</span>';
				}
					html += 	'</div>';
					html += '</div>';
				
				grid.innerHTML = html;
				
				// collect.appendChild(grid);
				documentFragment.appendChild(grid);
				
			} // end of for loop
			
			collect.appendChild(documentFragment);
			
			// Apply the event handlers for the "Child" select elements
			for (var i = gridsLength; i < rooms; i++) 
			{
				YAHOO.util.Event.on(
					form["child[" + i + "]"],"change", 
				 	function() {
						this.update(); 
						// Hotels.ClickTrack.click("Guest-Change");
					}, this, true);
			}
			
		} catch (e) {
			if (console) console.log(e.message);
		}
	}
});
