/**
 *
 * File is under copyright of WebAtoom and can
 * only be used with written permission of the author.
 *
 * @author Bouke Haarsma <bouke@webatoom.nl>
 * @copyright 2009, WebAtoom
 */


dhtmlHistory.create({
    toJSON: function(o) {
       return $.toJSON(o);
    },
    fromJSON: function(s) {
       return $.evalJSON(s);
    }
});

$.extend(String.prototype, {
	   getQueryParameter: function(parameter) {
	      parameter = escape(parameter);
	      var matches = this.match(new RegExp(parameter+"=([^&$]*)", "g"));

	      if(matches == null) {
	         return '';
	      }

	      return matches[0].substring(parameter.length+1);
	   }
	});

if(!Array.indexOf){
    $.extend(Array.prototype, {
        indexOf: function(obj){
            for(var i=0; i<this.length; i++){
                if(this[i]==obj){
                    return i;
                };
            };
        }
    });
};

if(!Array.hasValue){
	$.extend(Array.prototype, {
		hasValue: function(value) {
			for (var i=0;i<this.length;i++) { 
				if (this[i] === value) {
					return true;
				}
			};
			return false;
		}
	});
};


$(document).ready(function() {
   // We won't be needing this button!
   $("#zvSearch button").hide();
   
   var zvArrivalDates = zvAllArrivalDates;
   var zvDepartureDates = zvAllDepartureDates;
   
   // Enable datepicker for arrival date
   $("#zvSearch input[name='search[arrival]']").datepicker({
	   dateFormat: 'yy-mm-dd',
	   minDate: zvArrivalDates[0],
	   maxDate: zvArrivalDates[zvArrivalDates.length-1],
	   beforeShowDay: function(date) {
	   	  return new Array(
	   	     zvArrivalDates.hasValue($.datepicker.formatDate("yy-mm-dd", date))
	   	  );
	   } 
   });
   $("#zvSearch input[name='search[departure]']").datepicker({
	   dateFormat: 'yy-mm-dd',
	   minDate: zvDepartureDates[0],
	   maxDate: zvDepartureDates[zvDepartureDates.length-1],
	   beforeShowDay: function(date) {
	   	  return new Array(
	   	     zvDepartureDates.hasValue($.datepicker.formatDate("yy-mm-dd", date))
	   	  );
	   } 
   });

   $("#zvSearch").submit(function() {
	   zvSearch();
	   return false;
   });
   $("#zvSearch select").change(zvSearch);
   $("#zvSearch input[type=text]").change(zvSearch);
   $("#zvSearch input[type=checkbox]").click(zvSearch); // IE requires click for checkboxes

   $("#zvSearch input[name='search[arrival]']").change(updateDepartureDates);
   $("#zvSearch input[name='search[departure]']").change(updateArrivalDates);
   
   // Inject loading icon
   $("#zvSearch").append("<div id=\"zvAjaxLoading\" class=\"loading\"><img src=\"/assets/images/ajax-loader.gif\" alt=\"\"></div>");

   dhtmlHistory.initialize();
   dhtmlHistory.addListener(zvHistoryListener);

   // Open 'old' query
   if(dhtmlHistory.getCurrentLocation() != "") {
	   zvHistoryListener(dhtmlHistory.getCurrentLocation(), null);
   }
});

function updateArrivalDates() {
   var arrival = $("#zvSearch input[name='search[arrival]']");
   var departure = $("#zvSearch input[name='search[departure]']");
   if(!departure.val()) {
	   zvArrivalDates = zvAllArrivalDates;
	   $("#zvSearch input[name='search[arrival]']").datepicker("option", {
		   minDate: zvArrivalDates[0],
		   maxDate: zvArrivalDates[zvArrivalDates.length-1]});
   } else {
       $.getJSON(
           $("#zvSearch").attr("action"),
           {  format: "json", data: "arrivalDates", departureDate: departure.val() },
           function(data) { 
        	   zvArrivalDates = data; 
        	   $("#zvSearch input[name='search[arrival]']").datepicker("option", {
        		   minDate: data[0],
        		   maxDate: data[data.length-1]});

        	   // perform this in order to allow changing of dates, previous call was to fix the date of that field
        	   //X if(arrival.val() && departure.val()) {
        	   //X   zvArrivalDates = zvAllArrivalDates;
        	   //X	   $("#zvSearch input[name='search[arrival]']").datepicker("option", {
        	   //X		   minDate: zvArrivalDates[0],
        	   //X		   maxDate: zvArrivalDates[zvArrivalDates.length-1]});
        	   //X }
           }
       );
   }
}

function updateDepartureDates() {
   var arrival = $("#zvSearch input[name='search[arrival]']");
   var departure = $("#zvSearch input[name='search[departure]']");
   if(!arrival.val()) {
	   zvDepartureDates = zvAllDepartureDates;
	   $("#zvSearch input[name='search[departure]']").datepicker("option", {
		   minDate: zvDepartureDates[0],
		   maxDate: zvDepartureDates[zvDepartureDates.length-1]});
		   
   } else {
       
       //X here starts the magic
       $.getJSON(
           $("#zvSearch").attr("action"),
           {  format: "json", data: "departureDates", arrivalDate: arrival.val() },
           function(data) { 
        	   zvDepartureDates = data;
        	   $("#zvSearch input[name='search[departure]']").datepicker("option", {
        		   minDate: data[0],
        		   maxDate: data[data.length-1]});

        	   // perform this in order to allow changing of dates, previous call was to fix the date of that field
        	   
        	   
        	   //X if(arrival.val() && departure.val()) {
               //X   zvDepartureDates = zvAllDepartureDates;
               //X   $("#zvSearch input[name='search[departure]']").datepicker("option", {
               //X	   minDate: zvDepartureDates[0],
               //X	   maxDate: zvDepartureDates[zvDepartureDates.length-1]});
        	   //X }
    	   }
       );
   }
}

function zvSearch() {
   var formData = $.param($("#zvSearch input[type=checkbox]:checked, #zvSearch input[type=text], #zvSearch select"));

   $("#zvSearchResult").load(
		$("#zvSearch").attr("action") + " #zvSearchResult",
		formData,
		function(a,b,c) {
		   $("#zvAjaxLoading").hide();
		});

   $("#zvAjaxLoading")
      .css({
         height: Math.max(0, $("#zvSearchResult").height()
            - parseInt($("#zvAjaxLoading").css("padding-top")))
      })
      .show();

   dhtmlHistory.add(formData, null);
};


var zvHistoryListener = function(newLocation, historyData) {
   $("#zvSearch select[name='search[numPersons]']").val(
      newLocation.getQueryParameter("search[numPersons]"));
   
   $("#zvSearch input[name='search[arrival]']").val(
	  newLocation.getQueryParameter("search[arrival]"));
   updateDepartureDates();

   $("#zvSearch input[name='search[departure]']").val(
	  newLocation.getQueryParameter("search[departure]"));
   updateArrivalDates();

   $("#zvSearch input[name='search[smokingAllowed]']").attr("checked",
		newLocation.getQueryParameter("search[smokingAllowed]") ? "checked" : "");
		
   $("#zvSearch input[name='search[internetAvailable]']").attr("checked",
		newLocation.getQueryParameter("search[internetAvailable]") ? "checked" : "");


   $("#zvSearch input[name='search[petsAllowed]']").attr("checked",
		newLocation.getQueryParameter("search[petsAllowed]") ? "checked" : "");

   if(newLocation == "" && $("#zvSearchResult").hasClass("initiallyEmpty")) {
	   $("#zvSearchResult").html("");
      return;
   } else {
      $("#zvSearchResult").load(
         $("#zvSearch").attr("action") + " #zvSearchResult",
		 newLocation);
   }
};

