DWHotelSearcher = {

   /** Variable que indica cual es el pais */
   zgesup: null,

   /** 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
   },

   /* Parametro que indica si está en la home Publica o privada para diferenciar el buscador*/
   homePublic: false,

   /**
    * 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 = Math.ceil((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 de la home publica.
    */
   validatePublic: function () {

      dome.include("dome.util.Common");
      /* Comprobar que se han introducido las zonas */
      var error = "";
      var form = document.forms["frmHotelSearcher"];

      if (dome.util.Common.getComboValueById("codsca")){
         if (!form.elements["nomcodzge"].value || dome.util.Common.trimText(form.elements["nomcodzge"].value).length == 0) {
            error += "No se ha informado el destino";
         }
      }
      /* 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";
      } */

      return error;
   },

   /**
    * 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, si es la home publica solo se valida el destino */
      var error = "";
      if(DWHotelSearcher.homePublic){
         error = DWHotelSearcher.validatePublic();
      }else{
         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;
         }

         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);
            }
         }

         /*
         Event.addListener(document.getElementById("zgesup"), "change", DWHotelSearcher.changePai);
         if(DWHotelSearcher.zgesup == null || DWHotelSearcher.zgesup == ""){
            DWHotelSearcher.zgesup = dome.util.Common.getComboValueById("zgesup");
         }else{
            dome.util.Common.setComboValueById("zgesup", DWHotelSearcher.zgesup);
         }
         */

         /* Árbol */
         DWHotelSearcher.tree.obj = new dome.form.Tree(
            {
               inputId: "nomcodzgeHT",
//               url: "tree.do?codtse=HT&zgesup=" + DWHotelSearcher.zgesup,
               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);

         var cal = DWHotelSearcher.calendar;
         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();

         var form = document.forms["frmHotelSearcher"];
         Event.addListener(form, "submit", DWHotelSearcher.submit);

      }
   },

   changePai : function(ev){
      dome.include("dome.form.Tree");

      var Event = dome.util.Event;
      var target = Event.getEventTarget(ev ? ev : event);
      var zgesup = dome.util.Common.getComboValueById(target.id);
      DWHotelSearcher.tree.obj.updateUrl("tree.do?codtse=HT&zgesup=" + zgesup);   
   },

   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");
         
         Dom.appendChild(oLabel, document.createTextNode("Noches:"));

         var oCmb = document.createElement("select");
         oCmb.className = "selectNoches";
         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);
         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");
         }
      }
   }

};

(function () {
   dome.include("dome.util.Event");

   dome.util.Event.onDomReady(DWHotelSearcher.init);
})();
