/// <reference path="jquery-1.3.1-vsdoc.js"/>
/// <reference path="Logger.js"/>
/// <reference path="jquery.hotelSelector.js"/>
var PageForms = [];
var hotelRef;
var locationRef;

function Form() {

    var numberOfRoomsCtrl;
    var arrivalCalender;
    var departureCalender;
	var m_form;
	var dateRegex = /((0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[0-2])[- \/.](19|20)[0-9]{2})|((0?[1-9]|[12][0-9]|3[01])\s+\w{3}\s+(19|20)[0-9]{2})/i;
	
	function initialize(form) {
		m_form = $(form);
		m_form.submit(validate);
		Logger.log("Initialising form: " + form);
		numberOfRoomsCtrl = m_form.find("#number_of_rooms");
		numberOfRoomsCtrl.change(roomsChanged);
		displayRoomDetails();
		setupMoreOptionsEvents();
		setupToggleLinks();
		setupInfoPopup();
    }

	function displayRoomDetails() {
		var count = 1;
		var roomsCount = numberOfRoomsCtrl.val();
		m_form.find(".room").each(function() {
			if (count <= roomsCount)
				$(this).show()
			else
				$(this).hide();
			count++;
		});
	}

	function setupMoreOptionsEvents() {
		m_form.find("input[id^='extra_']").each(function() {
			$(this).click(handleExtras);
		});
	}

	function handleExtras() {
		var selected = false;
		m_form.find("input[id^='extra_']").each(
		function() {
			selected = selected || this.checked;
		});
		
		if (selected)
			disableHotelAndLocation();
		else
			enableHotelAndLocation();
	}

	function disableHotelAndLocation() {
		hotelRef.setValue('Select Hotel');
		hotelRef.disable();
		locationRef.setValue('Select Location');
		locationRef.disable();
	}

	function enableHotelAndLocation() {
		hotelRef.enable();
		locationRef.enable();	
	}
	
	function setupToggleLinks() {
	    m_form.find("a[name^='toggle_']").each(function() {
	        var jObj = $(this);
	        var isSmall = jObj.hasClass('small_toggle');
	        var divId = jObj.attr("name").split('_')[1];
	        jObj.click(function() {
	            var divObj = m_form.find('#' + divId).toggle();
	            if (isSmall) {
	                jObj.toggleClass('small_toggle_closed');
	            }
	            else {
	                jObj.toggleClass('toggle_closed');
	            }
	            return false;
	        });
	    });
	}

	function setupInfoPopup() {
	    m_form.find('.bookingInfo').click(function() {

                populatePopup(this);

                centerHorizontally(50);
                loadPopup();

                return false;
            });
	    
	    
	    $(".popupContactClose").click(function() {
                disablePopup();
                return false;
            });

            $("#backgroundPopup").click(function() {
                disablePopup();
            });
	    
	    //Press Escape event!
        $(document).keypress(function(e) {
            if (e.keyCode == 27 && popupStatus == 1) {
                disablePopup();
            }
        });
	}
	
	function populatePopup(link) {
        $("#popupContact > h1").text("Booking Search FAQ");

        $("#popupContact").css("width", "800px");
        
        var popupHtml = "<div class=\loading\">Loading: <img src=\"/images/ajax-loader.gif\" /></div>";
        
        $.get("/bookingfaq.htm", {}, function(data) {
            $("#popupContact > #popupContent").html(data);
            LoadSifrTitles();
        });

    }

    function LoadSifrTitles() {
        var trajan = {
            src: '/css/trajanpro.swf'
        };


        sIFR.replace(trajan, {
            selector: '#popupContact h1'
	        , css: '.sIFR-root { font-weight: bold; color:#FFFFFF;  }'
	        , wmode: 'transparent'
	        , selectable: false
        });
    
        sIFR.replace(trajan, {
            selector: '#popupContact h2'
	        , css: '.sIFR-root { font-weight: bold; color:#343434;  }'
	        , wmode: 'transparent'
	        , selectable: false
        });

        sIFR.replace(trajan, {
            selector: '#popupContact h3'
	    , css: '.sIFR-root { font-weight: bold; color:#433A37; text-align:left; padding:0; text-transform:uppercase; letter-spacing:0.3; } a { color:#433A37; font-size:60; letter-spacing:0.3; text-decoration: none; }'
	    , wmode: 'transparent'
        , selectable: false
        });
    }

	function roomsChanged() {
		Logger.log("Number of rooms has changed. New value is: " + numberOfRoomsCtrl.val());
		displayRoomDetails();
	}

	function validate() {
		var errors = [];
		
		if (m_form.find('#region').val() == '' &&
			m_form.find('#hotel').val() == '' &&
			m_form.find('#location').val() == '') {
			errors.push("Please select a region, hotel or location");
		}
		
		var arrival = m_form.find('#arrival').val();
		if (arrival == '') {
			errors.push("Please select arrival date");
		}
		else if (!arrival.match(dateRegex)) {
			errors.push("Please enter a valid arrival date");
		}

		var departure = m_form.find('#departure').val();
		if (departure == '') {
			errors.push("Please select departure date");
		}
		else if (!departure.match(dateRegex)) {
			errors.push("Please enter a valid departure date");
		}

		var departureDate = new Date(departure);
		var arrivalDate = new Date(arrival);
		if (arrivalDate > departureDate)
			errors.push("The departure date should be after the arrival date");
		
		
		var numberOfRoomsSelected = m_form.find("#number_of_rooms").val();
		for (var count = 1; count <= numberOfRoomsSelected; count++) {
			if (m_form.find("#room" + count + "_adults").val() == "")
				errors.push("Please select number of adults for room " + count);
		}
		
		if (errors.length > 0) {
			var errorMessage = "";
			var error = null;
			for( var i  = 0; i < errors.length; i++) {
				errorMessage += errors[i] + "\n";
			}
			alert(errorMessage);
			return false;
		}
		return true;
	}
	
	return {
		Init: initialize,
		RoomsChanged: roomsChanged,
		HandleExtras: handleExtras
	}
}

$(document).ready(function() {

	$(".AvailabilityForm").each(function() {
		var monthNames = new Array(12);
		monthNames[0] = "Jan";
		monthNames[1] = "Feb";
		monthNames[2] = "Mar";
		monthNames[3] = "Apr";
		monthNames[4] = "May";
		monthNames[5] = "Jun";
		monthNames[6] = "Jul";
		monthNames[7] = "Aug";
		monthNames[8] = "Sep";
		monthNames[9] = "Oct";
		monthNames[10] = "Nov";
		monthNames[11] = "Dec";

		var form = Form();
		form.Init(this);
		PageForms.push(form);
		Logger.log("Found and added a pageForm. Total count is: " + PageForms.length);

		// activate dropdownlists
		var region = new DropDownList("regionSelector");
		region.bind();

		hotelRef = new DropDownList("hotelSearchSelector");
		hotelRef.bind();

		locationRef = new DropDownList("locationSelector");
		locationRef.bind();

		region.valueChanged = function() {
			hotelRef.reset("Select Hotel");
			locationRef.reset("Select Location");
		};

		hotelRef.valueChanged = function() {
			region.reset("Select Region");
			locationRef.reset("Select Location");
		};

		locationRef.valueChanged = function() {
			hotelRef.reset("Select Hotel");
			region.reset("Select Region");
		};

		form.HandleExtras();

		var roomCount = new DropDownList("roomCountSelector");
		roomCount.bind();
		roomCount.valueChanged = function() {
			form.RoomsChanged();
		};

		var adultAndChildCountDropDowns = $("ul[id$='CountSelector']").not("ul[id$='roomCountSelector']");
		$.each(adultAndChildCountDropDowns, function(i, item) {
			var dropdownlist = new DropDownList($(item).attr("id"));
			dropdownlist.bind();
		});

		var arrivalDatePicker = $("#Arrival_jQueryCalendar");
		var departureDatePicker = $("#Departure_jQueryCalendar");

		arrivalDatePicker.datepicker(
			'option',
			'onSelect',
			function(dateText) {
				// set displayed value
				var valueField = $("." + arrivalDatePicker.attr("valueFieldCssClass"));
				if (valueField)
					valueField.val(dateText);

				// set departureDatePicker bounds and selected date
				var minDate = arrivalDatePicker.datepicker("getDate");
				minDate.setDate(minDate.getDate() + 1); // selected arrival date + 1d
				departureDatePicker.datepicker('option', 'minDate', minDate);

				//always set the departure date to be arrival + 1
				var departureDate = arrivalDatePicker.datepicker("getDate");
				departureDate.setDate(departureDate.getDate() + 1);
				departureDatePicker.datepicker("setDate", departureDate);

				// set departureDatePicker value field
				var departureValueField = $("." + departureDatePicker.attr("valueFieldCssClass"));
				if (departureValueField) {
					var departureDate = departureDatePicker.datepicker("getDate");
					departureValueField.val(departureDate.getDate() + " " + monthNames[departureDate.getMonth()] + " " + departureDate.getFullYear());
				}
			}
		);

		departureDatePicker.datepicker(
			'option',
			'onSelect',
			function(dateText) {
				// set departureDatePicker value field
				var departureValueField = $("." + departureDatePicker.attr("valueFieldCssClass"));
				if (departureValueField)
					departureValueField.val(dateText);
			}
		);
	});
});
