var isHome;
var isNano;
var isAdvanced;
var assetsLoaded = false;

var defaultView = 'simple';

function searcherValid() {
  var valid = HODest.valid() && HODate.valid() && HORooms.valid();
  if (!valid) searcherShowError();
  else $$(".nodis select, .novis select").each(function(i) { i.selectedIndex = 0 });
  return valid;
}

function initSearcher() {
  var viewField = $("view");
  var view = viewField ? viewField.value : 'simple';

  isNano = !!$("searcher_nano");
  isAdvanced = view == 'advanced';

  if (HODate == undefined) return;

  HODef.init();
  HODest.init();
  if (isNano) {
    HODDate.init();
    FormTips.init("sn_step1");
  } else if (isAdvanced) {
    HODate.init(2);
    HODDate.init();
  } else {
    HODate.init(2);
    HODDate.init();
  }

  HORooms.init();
  if ($("searcherForm"))  $("searcherForm").addEvent("submit", searcherValid);
  if ($("search_type_2")) $("search_type_2").addEvent("click", sendAdvanced);
}

function sendAdvanced(ev) {
  ev.stop();
  location.href = ev.target.href + "&" + $("searcherForm").toQueryString();
}

function enableSubmit(valid) {
	if (valid == undefined) 
		valid = HODest.valid() && HODate.valid() && HORooms.valid();
	if ($("searcher_valid")) (valid) ? $("searcher_valid").removeClass('novis'):$("searcher_valid").addClass('novis');
}

function searcherShowError() {
	enableSubmit();
	evalJson("errors = " + $("errorJson").value );
	var summary = [];
	if (!HODest.checkValid()) summary.push(errors['destination']);
	if (!HODate.checkValid()) summary.push(errors['dates']);
	if (!HORooms.checkValid()) summary.push(errors['rooms']);
	FxBox.showContent("<span class='fxb_msg'><ul><li>"+ summary.join("</li><li>") +"</li></ul></p></span>");
} 

var HODef = {
  init: function() {
    var lastSearch = $("lastSearch");
    if (lastSearch) HODef.list = JSON.decode(lastSearch.value);
      if ( $H(HODef.list).getLength() == 0 ) HODef.list = null;
      HODef.set("textDestination");
      HODef.set("Destination", "IdSearcher");
      HODef.setRoomsSelects();
      if (isNano || ($("ajx") && $("ajx").value=='true')) {
        if ($("hid_destination")) {
          // Set destination in destinations
          $("textDestination").value = $("hid_destination").value;
          $("txtDestText").empty();
        }
        else if ($("codeHotel")) {
          // Set hotel name and hide destination in infoHotel
          $("id_hotel_nano").value = $("codeHotel").value;
          $("hid_advanced").value = "true";
          $("txtDestText").empty();
          $("textDestination").addClass("nodis");
          $("fixedDestination").set( ($("fixedDestination").tagName=="INPUT")?"value":"html", $("nameHotel").value)
                  .removeClass("nodis");
          $("Destination").value="0";
        }
      }
  },
	getDayIn: function() {
		if (!HODef.list) return null;
		return new Date( [HODef.list.MonthIn, HODef.list.DayIn, HODef.list.YearIn].join("/") );
	},
	getDayOut: function() {
		if (!HODef.list) return null;
		return new Date( [HODef.list.MonthOut, HODef.list.DayOut, HODef.list.YearOut].join("/") );
	},
	get: function(key) {
		if (!HODef.list) return "";
		return HODef.list[key];
	},
	set: function(field, key) {
          var f = $(field);
          if (f && HODef.list) {
            var value = HODef.list[key || field];
            if (value) f.value = value;
          }
	},
	setRoomsSelects: function() {
		if (!HODef.list) return;
		$H(HODef.list).filter(function(v,k) { return (v!="" && k.test(/^H/)) })
			.each(function(v,k) { $(k).set('value', v); $(k).fireEvent('change'); });
	},
	list: null
}

var HODest = {
	wick: null,
	init: function() {
		HODest.wick = new Wick("textDestination", {
			ajaxUrl: "/Generator/FreeTexts/FreeText_[l]_"+ window.siteLang +"_[lang].json",
			hiddenField: "Destination", iconField: "loadingIcon",
			onMatch: HODest.doMatch, onDematch: HODest.doDematch,
			listFilter: function(i) { return i.P != "0";},
			gaEventCategory: "Buscador",
			gaEventAction: "Free-Text Destinos"
		});

	},
	valid: function() { return $("Destination").value != ""; },
	checkValid: function(nocheck) { return HODest.valid(); },
	request: null,
	doMatch: function(wk) {
		if ($("zone_block")) {
			if (HODest.request!=null) HODest.request.cancel();
			HODest.request = new Request({ method: 'get', url: '/AJAX/Zones.aspx?idSearcher='+ $("Destination").value, onSuccess: HODest.showZones }).send();
		}
		if ($("free_hotel_name") && $("free_hotel_name").wick) $("free_hotel_name").wick.filterList();
		enableSubmit();
	},
	doDematch: function(wk) {
		if ($("zone_block")) HODest.hideZones();
		if ($("free_hotel_name")) $("free_hotel_name").wick.filterList();
		enableSubmit();
	},
	showZones: function(res) { $("zones").set("html", res); $("zone_block").removeClass("nodis"); },
	hideZones: function() {  $("zone_block").addClass("nodis"); $("zones").set("html", ""); }
}

// ************ DATEPICKER FOR HOME AND AJAX SEARCHER
var HODate = {
  init: function(howMany, elementName) {
    $("datePicker").empty();    
    if (!$(HODate.cnf.elementName)) return false;
    var eName = elementName || HODate.cnf.elementName;
    HODate.element = document.getElementById(eName);
    if (HODate.element == null) return false;
    HODate.createMiniPickers();
    dateTemp=null;
    return this;
  },
        createMiniPickers: function() {
          var container = $("datePicker");
          var wrapper = new Element('div', { 'id':'sn_step2', 'class':'sn_block' });

          var divIn  = new Element('div', { 'id':'dateIn', 'class':'sn_block date'});
          var divOut = new Element('div', { 'id':'dateOut', 'class':'sn_block date'});

          var labelIn  = new Element('label', { 'for':'date_in', 'text':HODate.labelTexts['in'] });
          var labelOut = new Element('label', { 'for':'date_out', 'text':HODate.labelTexts['out'] });
          
          var inputIn  = new Element('input', { 'id':'date_in', 'name':'date_in', 'size':'10' });
          var inputOut = new Element('input', { 'id':'date_out', 'name':'date_out', 'size':'10' });

          container.adopt(wrapper);
          wrapper.adopt(divIn, divOut);
          divIn.adopt(labelIn, inputIn);
          divOut.adopt(labelOut, inputOut);

        },
	checkValid: function(nocheck) {
		if (nocheck == undefined) enableSubmit();
		return !isNano? HODate.valid():HODDate.valid();
	},
	valid: function() {
		return HODDate.valid();

		var dates = HODate.dates;
		var valid = (dates.length == 2) && !isNaN(dates[0].getDay()) && !isNaN(dates[1].getDay())
			&& HODate.checkRanges() && HODate.checkBookToday();
		if (HODate.cnf.showOk) $(HODate.cnf.dateOk).innerHTML = (valid) ? HODate.cnf.dateOkText : "";
		return valid;
	},
	setDate: function(date, fields) {
		$(fields[0]).value = HODate.twoDigits(date.getDate());
		$(fields[1]).value = HODate.twoDigits(date.getMonth()+1);
		$(fields[2]).value = date.getFullYear();
	},
	msToDays: function(ms) {
		return Math.round(ms/(24*60*60*1000));
	},
	clear: function() {
		HODate.cnf.inFields.each(function(i) { $(i).value = ""; });
		HODate.cnf.outFields.each(function(i) { $(i).value = ""; });
		$(HODate.cnf.dateFrom).innerHTML = "";
		$(HODate.cnf.dateTo).innerHTML = "";
		$(HODate.cnf.days).innerHTML = "";
	},
	element: null,
	dates: [],
	twoDigits: function(num) {
		return (num < 10)? "0"+num : ""+num;
	},
	checkRanges: function() {
		var d = HODate.dates;
		if (HODate.msToDays(d[1]-d[0]) < parseInt($(HODate.cnf.rangMin).value, 0)) return false;
		if (HODate.msToDays(d[1]-d[0]) > parseInt($(HODate.cnf.rangMax).value, 0)) return false;
		return true;
	},
	checkBookToday: function() {
		var d0 = HODate.dates[0];
		var today = new Date();
		if ($(HODate.cnf.bookToday).value != "true" && d0.getDate() == today.getDate() && 
			d0.getMonth() == today.getMonth() && d0.getFullYear() == today.getFullYear())
			return false;
		return true;
	},
	cnf: {
		elementName: "datePicker",
		info: "datePickerInfo",
		inFields: ["DayIn", "MonthIn", "YearIn"],
		outFields: ["DayOut", "MonthOut", "YearOut"],
		dateFrom: "dateFrom",
		dateTo: "dateTo",
		days: "dateNight",
		dateOk: "dateOk",
		dateOkText: ssp("<img src='{ssp}img/search/correcto.gif' />"),
		showOk: true,
		rangMin: "RangMin",
		rangMax: "RangMax",
		bookToday: "BookToday"
	},
	cal: null,
        labelTexts: {
          'in'  : 'Arrival',
          'out' : 'Departure'
        }
};

// DATEPICKER FOR DESTINATION FORMS
var HODDate = {
  init: function() {
    this.setDefaultDays();
    // Get days names and set Sunday first
    var daysNames = DateFormat.getWeekDayInitials();
    var monthNames = DateFormat.getMonthNames();
    this.cal = new Calendar({ date_in: 'd/m/Y', date_out: 'd/m/Y' },
            { direction: 0.5, offset:1, tweak: {x:-158, y:20}, days: daysNames, months: monthNames });
    this.cal.addEvent("change", HODDate.setHidFields);
  },
    restrictMonth: function(what) {
        var today = new Date();
        if ($("Year"+what).value == today.getFullYear() && $("Month"+what).value <= today.getMonth())
            $("Month"+what).selectedIndex = today.getMonth() + 1;
    },
    setDefaultDays: function(ev) {
		if (HODef.list) {
			var dateIn  = "{d}/{m}/{y}".substitute({ d:HODef.get("DayIn"), m:HODef.get("MonthIn"), y:HODef.get("YearIn") });
			var dateOut = "{d}/{m}/{y}".substitute({ d:HODef.get("DayOut"), m:HODef.get("MonthOut"), y:HODef.get("YearOut") });
			if (dateIn === "//") dateIn = "";
			if (dateOut === "//") dateOut = "";
			$("date_in").set("value", dateIn);
			$("date_out").set("value", dateOut);
			["DayIn","MonthIn","YearIn","DayOut","MonthOut","YearOut"].each(function(i) {
				var v = HODef.get(i);
				if (typeof(v) !== 'undefined') $(i).value = HODef.get(i);
			})
		} else {
			$("date_in").set("value", "");
			$("date_out").set("value", "");
		}
    },
	checkRanges: function() {
		var d = this.cal.calendars.map(function(i) {return i.val});
		if (HODate.msToDays(d[1]-d[0]) < parseInt($(HODate.cnf.rangMin).value, 0)) return false;
		if (HODate.msToDays(d[1]-d[0]) > parseInt($(HODate.cnf.rangMax).value, 0)) return false;
		return true;
	},
	checkBookToday: function() {
		var d0 = this.cal.calendars[0].val;
		var today = new Date();
		if ($(HODate.cnf.bookToday).value != "true" && d0.getDate() == today.getDate() && 
			d0.getMonth() == today.getMonth() && d0.getFullYear() == today.getFullYear())
			return false;
		return true;
	},
	setHidFields: function() {
		// this is calendar object
		HODDate.setDate(this.calendars[0].val, ["DayIn","MonthIn","YearIn"]);		
		HODDate.setDate(this.calendars[1].val, ["DayOut","MonthOut","YearOut"]);
		HODDate.checkValid();
	},
	setDate: function(date, fields) {
		if (date) {
			$(fields[0]).set("value", TwoDigits(date.getDate()));
			$(fields[1]).set("value", TwoDigits(date.getMonth()+1));
			$(fields[2]).set("value", date.getFullYear());
		} else
			fields.each(function(i) { $(i).set("value",""); });
	},
	valid: function() {
        var valid = this.cal && this.cal.calendars[0].val != null && this.cal.calendars[1].val != null
                && this.checkBookToday() && this.checkRanges();
        if (HODate.cnf.showOk && $(HODate.cnf.dateOk)) $(HODate.cnf.dateOk).innerHTML = (valid) ? HODate.cnf.dateOkText : "";
        return valid;
    },
    checkValid: function() { return HODDate.valid(); }
}

function TwoDigits(value) {
	return (value < 10)? "0"+value:""+value;
}

Date.prototype.getMonthDay= function(){
	var dTempx=new Date(this);
	var dTempa=dTempx.setDate(1);
	var dTempb= dTempx.setMonth(dTempx.getMonth()+1);
	var daysMonth= Math.round((dTempb-dTempa)/(24*60*60*1000));
	dTempx=dTempa=dTempb=null;
	return parseInt(daysMonth);
};
Date.prototype.plusDate= function(){
	var dTemp=this;
	arguments[0]=(arguments[0])?(dTemp.getFullYear()+arguments[0]):dTemp.getFullYear();
	arguments[1]=(arguments[1])?(dTemp.getMonth()+arguments[1]):dTemp.getMonth();
	arguments[2]=(arguments[2])?(dTemp.getDate()+arguments[2]):dTemp.getDate();
	arguments[3]=(arguments[3])?(dTemp.getHours()+arguments[3]):dTemp.getHours();
	var plusD=new Date(arguments[0],arguments[1],arguments[2],arguments[3]);
	return plusD;
};
Date.prototype.compareDate= function(){
	var aTemp= new Date(arguments[0]);
	var bTemp= new Date(arguments[1]);
	return ((this.toString()==arguments[0]) || this>aTemp&&this<bTemp || (this.toString()==arguments[1]));
};
Date.prototype.pickerElement = null;
Date.prototype.calendars=new Array;	
Date.prototype.selDates=new Array;	
Date.prototype.spans=new Array;	
Date.prototype.createCalendar= function(sId, element){
	element = element || this.pickerElement ||document.body;
	this.pickerElement = element;
	var nowOK=new Date();
	nowOK.setHours(0);
	nowOK.setMinutes(0);
	nowOK.setSeconds(0);
	nowOK.setMilliseconds(0);
	this.now=nowOK;
	this.format=new Date(this.getFullYear(),this.getMonth(),this.getDate());
	this.capaCal=document.getElementById(sId);
	this.sid=sId;
	var oFragment = document.createDocumentFragment();
	oFragment.