DWHotelSearcher = {

   /** Datos para la distribución. */
   distri: {
      /** Objeto de <code>Distri</code> que permite introducir la distribución en el formulario. */
      obj: null,

      /** Configuraciones del objeto. */
      maxuni: 3,
      maxadu: 4,
      maxnin: 2,
      maxeda: 12,
      value: null
   },

   /** Árbol de zonas */
   tree: {
      /* Instancia */
      obj: null,
      /* Zona seleccionada por javacript */
      nomcodzge: null,
      codzge: null
   },

   /** Datos para los calendarios */
   calendar: {
      /** Calendario para la fecha de inicio. */
      calini: null,
      /** Calendario para la fecha de fin. */
      calfin: null,
      /** Fecha mínima. */
      fecmin: null,
      /** Fecha máxima. */
      fecmax: null
   },

   /** Combo de número de noches. */
   numnoc: {
      /** Número máximo de noches. */
      nocmax: null,
      /** Combo de número de noches. */
      combo: null
   },

   /**
    * Carga de datos a partir del xml, se redefine en la xsl.
    */
   loadData: function () {
      return false;
   },

   /**
    * Función que valida si el día es válido para el calendario de fecha de regreso.
    *
    * @param {Date} day            Fecha que contiene el campo fecini del calendar
    */
   fecfinDayStatus: function (day) {

      var fecini = DWHotelSearcher.calendar.calini.getDate();
      if (!fecini || fecini.getTime() < day.getTime()) {
         if (fecini && DWHotelSearcher.numnoc.nocmax) {
            return (((day.getTime() - fecini.getTime()) / 86400000) <= DWHotelSearcher.numnoc.nocmax);
         } else {
            return true;
         }
      } else {
         return false;
      }
   },  

   /** Función que se dispara cada vez que se cambia la fecha de inicio. */
   feciniChangeHandler: function () {
      var fecini = DWHotelSearcher.calendar.calini.getDate();
      var fecfin = DWHotelSearcher.calendar.calfin.getDate();
      if (fecini) {
         if (!fecfin) {
            fecfin = new Date();
            fecfin.setTime(fecini.getTime() + 86400000);
         } else {
            if (DWHotelSearcher.numnoc.combo) {
               var noc = dome.util.Common.getComboValue(DWHotelSearcher.numnoc.combo);
               fecfin.setTime(fecini.getTime() + (noc * 86400000));

            } else if (fecfin.getTime() <= fecini.getTime()) {
               fecfin = new Date();
               fecfin.setTime(fecini.getTime() + 86400000);
            }
         }
         DWHotelSearcher.calendar.calfin.setDate(fecfin);
      }
   },

   /**
    * Función que se dispara cada vez que se cambia la fecha de fin.
    */
   fecfinChangeHandler: function (ev) {
      var fecini = DWHotelSearcher.calendar.calini.getDate();
      var fecfin = DWHotelSearcher.calendar.calfin.getDate();
      if (fecini && fecfin) {
         var numnoc = (fecfin.getTime() - fecini.getTime()) / 86400000;
         var oCmb = DWHotelSearcher.numnoc.combo;
         if (oCmb) {
            if (numnoc <= DWHotelSearcher.numnoc.nocmax) {
               if (oCmb) { dome.util.Common.setComboValue(oCmb, numnoc); }
            } else {
               alert("La fecha de salida no puede ser mayor a la del mximo numero de noches seleccionables");
            }
         }
      } else if (!fecini && fecfin) {
         fecini = new Date();
         fecini.setTime(fecfin.getTime() - 86400000);
         DWHotelSearcher.calendar.calini.setDate(fecini);
      }
   },

   /**
    * Valida el formulario.
    */
   validate: function () {
      /* Comprobar que se han introducido las zonas */
      var error = "";
      var form = document.forms["frmHotelSearcher"];

      /* Si no ha salido a partir del árbol se valida que haya texto en el input. */
      if (!form.elements["nomcodzge"].value || dome.util.Common.trimText(form.elements["nomcodzge"].value).length == 0) {
         error += "No se ha informado el destino";
      }

      var cal = DWHotelSearcher.calendar;
      var fecini = cal.calini.getDate();
      var fecfin = cal.calfin.getDate();

      if (!fecini) {
         if (error.length > 0) {
            error += "\n";
         }
         error += "No se ha informado la fecha de salida";
      }

      if (!fecfin) {
         if (error.length > 0) {
            error += "\n";
         }
         error += "No se ha informado la fecha de regreso";
      }

      if (fecini && fecfin) {
         if (fecini.getTime() >= fecfin.getTime()) {
            if (error.length > 0) {
               error += "\n";
            }
            error += "La fecha de regreso debe ser mayor a la de salida";
         }
      }

      return error;
   },

   /**
    * Función que valida el formulario y lanza el submit.
    */
   submit: function (ev) {
      /* Alias */
      var Event = dome.util.Event;

      var form = document.forms["frmHotelSearcher"];

      /* Validación */
      var error = DWHotelSearcher.validate();

      if (error && error.length > 0) {
         alert(error);
         Event.stopEvent(ev ? ev : event);
         return false;
      } else {
         /* Si se supera la validación, volcar los valores de los componentes al formulario. */
         if (DWHotelSearcher.distri.obj) {
            form.elements["distri"].value = DWHotelSearcher.distri.obj.getValue();
         }

         if (DWHotelSearcher.tree.obj && DWHotelSearcher.tree.nomcodzge == form.elements["nomcodzge"].value) {
            form.elements["codzge"].value = DWHotelSearcher.tree.codzge;
            if(form.elements["zgedes"])
                form.elements["zgedes"].value = DWHotelSearcher.tree.codzge;
         }

         DWCommon.showWaiting();
         return true;
      }
   },

   /**
    * Inicializa los componentes del buscador de hotel.
    */
   init: function () {
      /* Dependencias */
      dome.include("dome.util.Common");
      dome.include("dome.distri.Distri");
      dome.include("dome.form.Tree");
      dome.include("dome.form.DatePicker");

      /* Alias */
      var Event = dome.util.Event;

      var loadOk = DWHotelSearcher.loadData();
      if (loadOk) {
         var lang = "SPA";
         if (lang.indexOf('@') != -1) { /* Translate */
            lang = "SPA";
         }

         /* Objeto de distribución */
         if (document.getElementById("divDistriHotel")) {
            var distri = DWHotelSearcher.distri;
            distri.obj = new dome.distri.Distri(
               {
                  name: "hotelDistri",
                  container: "divDistriHotel",
                  maxUni: distri.maxuni,
                  maxAdu: distri.maxadu,
                  maxNin: distri.maxnin,
                  maxEda: distri.maxeda,
                  lang: lang
               }
            );

            if (distri.value != null) {
               distri.obj.setValue(distri.value);
            }
         }



       var fromCartTxt = 'false';
       if(document.getElementById('fromCart')) {
           fromCartTxt = document.getElementById('fromCart').value;
       }
        if(fromCartTxt != 'true') {
             /* Árbol */
             DWHotelSearcher.tree.obj = new dome.form.Tree(
                {
                   inputId: "nomcodzgeHT",
                   url: "tree.do?codtse=HT",
                   height: 225
                }
             );
             DWHotelSearcher.tree.obj.selectedEvent.subscribe(DWHotelSearcher.treeSelectHandler);
        }

         /* Calendario */
         var cal = DWHotelSearcher.calendar;
         cal.calini = new dome.form.DatePicker(
            {
               name: "fecini",
               container: "fecinicalHT",
               inputField: "feciniHT",
               minDate: cal.fecmin,
               maxDate: cal.fecmax,
               lang: lang
            }
         );
         cal.calini.changeEvent.subscribe(DWHotelSearcher.feciniChangeHandler);

         cal.calfin = new dome.form.DatePicker(
            {
               name: "fecfin",
               container: "fecfincalHT",
               inputField: "fecfinHT",
               minDate: cal.fecmin,
               maxDate: cal.fecmax,
               dayStatus: DWHotelSearcher.fecfinDayStatus,
               lang: lang
            }
         );
         cal.calfin.changeEvent.subscribe(DWHotelSearcher.fecfinChangeHandler);

         /* Aseguramos un estado válido de los calendarios. */
         DWHotelSearcher.feciniChangeHandler();
         /* Construimos el combo de numero de noches. */
         DWHotelSearcher.buildNumnocCombo();

         Event.addListener(document.forms["frmHotelSearcher"], "submit", DWHotelSearcher.submit);
		 
		 if (document.getElementById("codcam")) {
			 Event.addListener(document.getElementById("codcam"), "change", DWHotelSearcher.updateUrlTree);
		 }
		 
      }
   },

   treeSelectHandler: function (evType, param1, param2) {
      if (param2) {
         DWHotelSearcher.tree.nomcodzge = param2["text"];
         DWHotelSearcher.tree.codzge = param2["value"];
      }
   },

   /**
    * Se crea el div con el combo de seleccion de numero de noches
    */
   buildNumnocCombo: function() {
      /* Alias */
      var Dom = dome.util.Dom;

      var div = document.getElementById("divNumnocHT");
      if (DWHotelSearcher.numnoc.nocmax) {
         var oPrg = document.createElement("p");
         var oLabel = document.createElement("label");

          if(document.getElementById('busquedaDiv')) {
              oLabel.className = "nombreCampo2";
          } else {
              oLabel.className = "nombreCampo";
          }
         Dom.appendChild(oLabel, document.createTextNode("Noches:"));

         var oCmb = document.createElement("select");
          oCmb.setAttribute("style","margin-top: 2px");
         for (var i = 1; i <= DWHotelSearcher.numnoc.nocmax; i++) {
            var oOpt = document.createElement("option");
            oOpt.value = i;
            oOpt.appendChild(document.createTextNode(i));
            oCmb.appendChild(oOpt);
         }
         dome.util.Event.addListener(oCmb, "change", DWHotelSearcher.numnocChanged);

         Dom.appendChild(oPrg, oLabel);
          if(!document.getElementById('busquedaDiv')) {
              Dom.appendChild(oPrg, document.createElement("br"));
          }
         Dom.appendChild(oPrg, oCmb);
         Dom.appendChild(div, oPrg);

         DWHotelSearcher.numnoc.combo = oCmb;

         /* Inicializar */
         var fecini = DWHotelSearcher.calendar.calini.getDate();
         var fecfin = DWHotelSearcher.calendar.calfin.getDate();
         if (fecini && fecfin) {
            var value = (fecfin.getTime() - fecini.getTime()) / 86400000;
            dome.util.Common.setComboValue(oCmb, value);
         }
      }
   },


   /**
    * Trata el evento de cambio del combo de número de noches
    */
   numnocChanged : function(ev) {
      var target = dome.util.Event.getEventTarget(ev ? ev : event);

      if (target) {
         var fecini = DWHotelSearcher.calendar.calini.getDate();
         if (fecini) {
            var fecfin = new Date();
            var nocsel = dome.util.Common.getComboValue(target);

            fecfin.setTime(fecini.getTime() + (nocsel * 86400000));
            if (((fecini.getTime() - fecfin.getTime()) / 86400000) != nocsel) {
               DWHotelSearcher.calendar.calfin.setDate(fecfin);
            }
         } else {
            target.value = "1";
            alert("No se ha informado la fecha de salida");
         }
      }
   },
   
   /**
    * Actualiza la url en el objeto DWHotelSearcher.tree.obj = new dome.form.Tree
    */
   updateUrlTree : function() {	
		var form = document.forms["frmHotelSearcher"];
        var codcam = form.elements["codcam"].value;
		var url = 'tree.do?codtse=HT';
        if (codcam && codcam != '') {
            url += '&zgesup=PQ&codcam=' + codcam;
        }
		document.getElementById('nomcodzgeHT').value = '';
		DWHotelSearcher.tree.obj.updateUrl(url);
   }

};

(function () {
   dome.include("dome.util.Event");

   dome.util.Event.onDomReady(DWHotelSearcher.init);
})();

