DWMultSearcher = {

   /** Tipo de disponibilidad múltiple. */
   codtse: null,

   /** Dato para la carga del campo destino*/
   codcam: 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: 3,
      maxeda: 17,
      value: 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
   },

   /** Autocompletar */
   autocomplete: {
      /** Instancias de los autocompletar. */
      objori: null,
      objdes: null,
      /* Zonas seleccionadas por javacript */
      nomaerori: null,
      nomaerdes: null,
      aerori: null,
      aerdes: null

   },

   /** Árbol de zonas */
   tree: {
      /* Instancia */
      objcodzge: null,
      objzgeori: null,
      objcodzgeHT: null,

      /* Zona seleccionada por javacript */
      nomcodzge: null,
      codzge: null,
      nomzgeori: null,
      zgeori: null,
      nomcodzgeHT: null,
      codzgeHT: 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 = DWMultSearcher.calendar.calini.getDate();
      if (!fecini || fecini.getTime() < day.getTime()) {
         return true;
      } else {
         return false;
      }
   },

   /** Función que se dispara cada vez que se cambia la fecha de inicio. */
   feciniChangeHandler: function () {
      var fecini = DWMultSearcher.calendar.calini.getDate();
      var fecfin = DWMultSearcher.calendar.calfin.getDate();
      if (fecini) {
         if (!fecfin) {
            fecfin = new Date();
            fecfin.setTime(fecini.getTime() + 86400000);
         } else if (fecfin.getTime() <= fecini.getTime()) {
            fecfin = new Date();
            fecfin.setTime(fecini.getTime() + 86400000);
         }
         DWMultSearcher.calendar.calfin.setDate(fecfin);
      }
   },

   /**
    * Función que se dispara cada vez que se cambia la fecha de fin.
    */
   fecfinChangeHandler: function (ev) {
      var fecini = DWMultSearcher.calendar.calini.getDate();
      var fecfin = DWMultSearcher.calendar.calfin.getDate();
      if (!fecini && fecfin) {
         fecini = new Date();
         fecini.setTime(fecfin.getTime() - 86400000);
         DWMultSearcher.calendar.calini.setDate(fecini);
      }
   },

   /**
    * Valida el formulario.
    */
   validate: function (ev) {
      /* Alias */
      var Common = dome.util.Common;

      /* Comprobar que se han introducido las zonas */
      var error = "";
      var form = document.forms["frmMultSearcher"];

      /* Si no ha salido a partir del autocompletar se valida que haya texto en el input. */
      if (form.elements["nomaerori"]) {
         if (!form.elements["nomaerori"].value || dome.util.Common.trimText(form.elements["nomaerori"].value).length == 0) {
            error += "No se ha informado la zona de origen";
         }
      }

      /*if (form.elements["nomaerdes"]) {
       if (!form.elements["nomaerdes"].value || dome.util.Common.trimText(form.elements["nomaerdes"].value).length == 0) {
       if (error.length > 0) { error += "\n"; }
       error += "No se ha informado la zona de destino";
       }
       } */

      /* Si no ha salido a partir del árbol se valida que haya texto en el input. */
      if (form.elements["nomzgeori"]) {
         if (!form.elements["nomzgeori"].value || dome.util.Common.trimText(form.elements["nomzgeori"].value).length == 0) {
            error += "";
         }
      }

      if (form.elements["nomcodzge"]) {
         if (!form.elements["nomcodzge"].value || dome.util.Common.trimText(form.elements["nomcodzge"].value).length == 0) {
            if (error.length > 0) { error += "\n"; }
            error += "";
         }
      }

      var cal = DWMultSearcher.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";
      }

      /* Si es idavuelta hay que mirar más cosas. */
      if (Common.getRadioValue(form.elements["idavue"]) == "S") {
         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;
   },

   calcCodcam: function () {

      dome.include("dome.form.Tree");

      /*Opcio que semixusca... codcam recull es valor pero UpdateUrl peta*/
      DWMultSearcher.codcam = dome.util.Common.getRadioValueByName('frmMultSearcher','selection');
      DWMultSearcher.tree.objcodzgeHT.updateUrl("tree.do?codtse=AE%23HT&codcam=" + DWMultSearcher.codcam);
   } ,

   /**
    * 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["frmMultSearcher"];

      /* Validación */
      var error = DWMultSearcher.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 (DWMultSearcher.distri.obj) {
            form.elements["distri"].value = DWMultSearcher.distri.obj.getValue();
         }

         if (DWMultSearcher.autocomplete.objori && DWMultSearcher.autocomplete.nomaerori == form.elements["nomaerori"].value) {
            form.elements["aerori"].value = DWMultSearcher.autocomplete.aerori;
         }

         /*if (DWMultSearcher.autocomplete.objdes && DWMultSearcher.autocomplete.nomaerdes == form.elements["nomaerdes"].value) {
          form.elements["aerdes"].value = DWMultSearcher.autocomplete.aerdes;
          } */

         /* Si se supera la validación, volcar los valores de los componentes al formulario. */
         if (DWMultSearcher.tree.objcodzge && DWMultSearcher.tree.nomcodzge == form.elements["nomcodzge"].value) {
            form.elements["codzge"].value = DWMultSearcher.tree.codzge;
         }
         if (DWMultSearcher.tree.objzgeori && DWMultSearcher.tree.nomzgeori == form.elements["nomzgeori"].value) {
            form.elements["zgeori"].value = DWMultSearcher.tree.zgeori;
         }
         if (DWMultSearcher.tree.objcodzgeHT && DWMultSearcher.tree.nomcodzgeHT == form.elements["nomcodzgeHT"].value) {
            form.elements["HT.codzge"].value = DWMultSearcher.tree.codzgeHT;
         }

         DWCommon.showWaiting();
         return true;
      }
   },

   /**
    * Inicializa los componentes del buscador de vuelo + hotel.
    */
   init: function () {
      /* Dependencias */
      dome.include("dome.util.Common");
      dome.include("dome.distri.Distri");
      dome.include("dome.form.DatePicker");
      dome.include("dome.form.Tree");
      dome.include("dome.form.Autocomplete");

      /* Alias */
      var Event = dome.util.Event;

      var loadOk = DWMultSearcher.loadData();

      if (loadOk) {
         var lang = "SPA";
         if (lang.indexOf('@') != -1) { /* Translate */
            lang = "SPA";
         }

         /* Objeto de distribución */
         if (document.getElementById("divDistriMult")) {
            var distri = DWMultSearcher.distri;
            distri.obj = new dome.distri.Distri(
            {
               name: "multDistri",
               container: "divDistriMult",
               maxUni: distri.maxuni,
               maxAdu: distri.maxadu,
               maxNin: distri.maxnin,
               maxEda: distri.maxeda,
               lang: lang
            }
                  );

            if (distri.value != null) {
               distri.obj.setValue(distri.value);
            }
         }

         if (DWMultSearcher.codtse == "AE#HT") {
            /* Autocompletar */
            DWMultSearcher.autocomplete.objori = new dome.form.Autocomplete(
            {
               inputField: "nomaeroriMU",
               url: "autocomplete.do?codtse=AE"
            }
                  );
            DWMultSearcher.autocomplete.objori.selectedEvent.subscribe(DWMultSearcher.autocompleteSelectHandler, "aerori");

            DWMultSearcher.autocomplete.objdes = new dome.form.Autocomplete(
            {
               inputField: "nomaerdesMU",
               url: "autocomplete.do?codtse=AE"
            }
                  );
            DWMultSearcher.autocomplete.objdes.selectedEvent.subscribe(DWMultSearcher.autocompleteSelectHandler, "aerdes");

            if (DWMultSearcher.codcam == null || DWMultSearcher.codcam == "")  {
               DWMultSearcher.codcam = dome.util.Common.getRadioValueByName('frmMultSearcher','selection');
            }
            DWMultSearcher.tree.objcodzgeHT = new dome.form.Tree(
            {
               inputId: "nomcodzgeHT",
               url: "tree.do?codtse=AE%23HT&codcam=" + DWMultSearcher.codcam,
               height: 225
            }
                  );

         } else if (DWMultSearcher.codtse == "TE#HT") {
            DWMultSearcher.tree.objcodzge = new dome.form.Tree(
            {
               inputId: "nomcodzgeMU",
               url: "tree.do?codtse=TE",
               height: 225
            }
                  );
            DWMultSearcher.tree.objcodzge.selectedEvent.subscribe(DWMultSearcher.treeSelectHandler, "codzge");

            DWMultSearcher.tree.objzgeori = new dome.form.Tree(
            {
               inputId: "nomzgeoriMU",
               url: "tree.do?codtse=TE",
               height: 225
            }
                  );
            DWMultSearcher.tree.objzgeori.selectedEvent.subscribe(DWMultSearcher.treeSelectHandler, "zgeori");

            DWMultSearcher.tree.objcodzge = new dome.form.Tree(
            {
               inputId: "nomcodzgeMU",
               url: "tree.do?codtse=TE",
               height: 225
            }
                  );

            DWMultSearcher.tree.objcodzge.selectedEvent.subscribe(DWMultSearcher.treeSelectHandler, "codzge");

            DWMultSearcher.tree.objcodzgeHT = new dome.form.Tree(
            {
               inputId: "nomcodzgeHT",
               url: "tree.do?codtse=HT&zgesup=Co_ES",
               height: 225
            }
                  );

         } else if (DWMultSearcher.codtse == "BC#HT") {

            DWMultSearcher.tree.objcodzgeHT = new dome.form.Tree(
            {
               inputId: "nomcodzgeHT",
               url: "tree.do?codtse=HT",
               height: 225
            }
                  );
         }

         DWMultSearcher.tree.objcodzgeHT.selectedEvent.subscribe(DWMultSearcher.treeSelectHandler, "HT.codzge");

         /* Calendario */
         var cal = DWMultSearcher.calendar;
         cal.calini = new dome.form.DatePicker(
         {
            name: "fecini",
            container: "fecinicalMU",
            inputField: "feciniMU",
            minDate: cal.fecmin,
            maxDate: cal.fecmax,
            lang: lang
         }
               );
         cal.calini.changeEvent.subscribe(DWMultSearcher.feciniChangeHandler);

         var cal = DWMultSearcher.calendar;
         cal.calfin = new dome.form.DatePicker(
         {
            name: "fecfin",
            container: "fecfincalMU",
            inputField: "fecfinMU",
            minDate: cal.fecmin,
            maxDate: cal.fecmax,
            dayStatus: DWMultSearcher.fecfinDayStatus,
            lang: lang
         }
               );
         cal.calfin.changeEvent.subscribe(DWMultSearcher.fecfinChangeHandler);

         /* Aseguramos un estado válido de los calendarios. */
         DWMultSearcher.feciniChangeHandler();

         Event.addListener(document.forms["frmMultSearcher"], "submit", DWMultSearcher.submit);
      }
   },

   treeSelectHandler: function (evType, param1, param2) {
      if (param1 == "codzge" && param2) {
         DWMultSearcher.tree.nomcodzge = param2["text"];
         DWMultSearcher.tree.codzge = param2["value"];
      } else if (param1 == "zgeori" && param2) {
         DWMultSearcher.tree.nomzgeori = param2["text"];
         DWMultSearcher.tree.zgeori = param2["value"];
      } else if (param1 == "HT.codzge" && param2) {
         DWMultSearcher.tree.nomcodzgeHT = param2["text"];
         DWMultSearcher.tree.codzgeHT = param2["value"];
      }
   },

   autocompleteSelectHandler: function (evType, param1, param2) {
      if (param1 == "aerori") {
         DWMultSearcher.autocomplete.nomaerori = DWMultSearcher.autocomplete.objori.nomzge;
         DWMultSearcher.autocomplete.aerori = DWMultSearcher.autocomplete.objori.codzge;
      } else if (param1 == "aerdes") {
         DWMultSearcher.autocomplete.nomaerdes = DWMultSearcher.autocomplete.objdes.nomzge;
         DWMultSearcher.autocomplete.aerdes = DWMultSearcher.autocomplete.objdes.codzge;
      }
   }
};

/* Inicilización. */
(function() {
   /* Dependencias */
   dome.include("dome.util.Event");

   /* Alias */
   var Event = dome.util.Event;

   Event.onDomReady(DWMultSearcher.init);

})();
