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: 3,
      maxeda: 17,
      value: null
   },

   /** Autocompletar */
   autocomplete: {
      nomcodzge: 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
   },

    contLeter: 0,
    contArbolTimer: 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 máximo 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 (ev) {

      /* Comprobar que se han introducido las zonas */
      var error = "";
      var form = document.forms["frmHotelSearcher"];

      /* Si no ha salido a partir del autocompletar se valida que haya texto en el input. */
      if (!form.elements["codzge"].value || form.elements["codzge"].value != DWHotelSearcher.autocomplete.nomcodzge.codzge) {
         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 Dom = dome.util.Dom;

      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();
         }

	 var codzge = DWHotelSearcher.autocomplete.nomcodzge.codzge;
         if (codzge && codzge.length > 0) {
               form.elements["codzge"].value = 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.Autocomplete");
      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);
            }
         }

         /* Autocompletar */
         DWHotelSearcher.autocomplete.nomcodzge = new dome.form.Autocomplete(
            {
               inputField: "nomcodzgeHT",
               url: "autocomplete.do?codtse=HT"
            }
         );

         /* 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);
            if(document.getElementById("arbol")){
                Event.addListener(form.elements["nomcodzgeHT"], "click", DWHotelSearcher.mostrarArbol);
                Event.addListener(form.elements["nomcodzgeHT"], "keyup", DWHotelSearcher.contArbolLeter);
                Event.addListener(form.elements["nomcodzgeHT"], "blur", DWHotelSearcher.startCountDown);
                Event.addListener(document.getElementById("arbol"), "mouseover", DWHotelSearcher.stopCountDown);
                Event.addListener(document.getElementById("arbol"), "mouseout", DWHotelSearcher.startCountDown);
            }
        }
    },

    /**
     * funcion que muestra el arbol de destinos
     */
    mostrarArbol : function(){
        var div = document.getElementById("arbol");
        div.style.display = "block";
        var ua = dome.userAgent();
        if(ua.ie > 0 && ua.ie < 7){
            var iframe = document.getElementById("arbolframe");
            iframe.width = div.offsetWidth - 5;
            iframe.height = div.offsetHeight - 5;
            iframe.style.display = "block";
        }
    },

    /**
     * funcion que oculta el arbol de destinos
     */
    ocultarArbol : function(){
        document.getElementById("arbol").style.display = "none";
        document.getElementById("arbol").style.height = "auto";
        var ua = dome.userAgent();
        if(ua.ie > 0 && ua.ie < 7){
            document.getElementById("arbolframe").style.display = "none";
        }
    },

    /**
     * funcion para controlar la longitud del valor del input
     * @param ev   evento que lo lanza
     */
    contArbolLeter : function(ev){
        var target = dome.util.Event.getEventTarget(ev ? ev : event);
        if(target){
            if(target.value.length > 3){
                DWHotelSearcher.ocultarArbol();
                DWHotelSearcher.contLeter = 0;
            }
        }
    },

    /**
     * funcion para mostrar una lista
     * @param ev  evento que lo lanza
     */
    mostrarLista : function(ev){
        var Event = dome.util.Event;
        ev = ev ? ev : event;
        var target = Event.getEventTarget(ev);
        var id = target.id.substring(4);
        var aux = id.split("#");
        var obj = document.getElementById('ul_' + aux[0]);
        if(obj.style.display != "none"){
            obj.style.display = "none";
        }else{
            obj.style.display = "block";
        }
        Event.stopEvent(ev);
        DWHotelSearcher.resizeArbol();
    },

    /**
     * funcion para cambiar tamaño del div del arbol segun las opciones
     */
    resizeArbol : function(){
        var div = document.getElementById("arbol");
        var ua = dome.userAgent();
        var ul;
        for (var i = 0; i < div.childNodes.length; i++){
            if(div.childNodes[i].nodeName == "UL"){
                ul = div.childNodes[i];
            }
        }
        var height = ul.offsetHeight;
        var iframe = document.getElementById("arbolframe");
        if(height >= 200){
            div.style.height = "200px";
            if(ua.ie > 0 && ua.ie < 7){
                iframe.height = 195;
            }
        }else{
            div.style.height = "auto";
            if(ua.ie > 0 && ua.ie < 7){
                iframe.width = div.offsetWidth - 5;
                iframe.height = div.offsetHeight - 5;
            }
        }

    },

    /**
     * funcion que selecciona una opcon del arbol
     * @param ev   evento que lo lanza
     */
    selecArbolOpcion : function (ev){
        var Event = dome.util.Event;
        ev = ev ? ev : event;
        var target = Event.getEventTarget(ev);
        var id = target.id.substring(3);
        var aux = id.split("#");
        document.forms["frmHotelSearcher"].elements["codzge"].value = aux[0];
        document.forms["frmHotelSearcher"].elements["nomcodzge"].value = aux[1];
        document.getElementById("nomcodzgeHT").value = aux[1];
        DWHotelSearcher.ocultarArbol();
    },

    /**
     * funcion que inicializa un contador si se ha salido del arbol
     */
    startCountDown : function(){
        if (!DWHotelSearcher.cont) {
            DWHotelSearcher.cont = setTimeout(function () {DWHotelSearcher.ocultarArbol();},3000);
        }
    },

    /**
     * funcion que resetea el contador del arbol
     */
    stopCountDown : function(){
        clearTimeout(DWHotelSearcher.cont);
        DWHotelSearcher.cont = null;
   },

   /**
    * 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);
})();
