DWOtherSearcher = {

    /** 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,
        /** Combe de número de noches. */
        combo: null
    },

    /** Tipo de servicio */
    codtse: 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 = DWOtherSearcher.calendar.calini.getDate();
        if (!fecini || fecini.getTime() < day.getTime()) {
            if (fecini && DWOtherSearcher.numnoc.nocmax) {
                return (((day.getTime() - fecini.getTime()) / 86400000) <= DWOtherSearcher.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 = DWOtherSearcher.calendar.calini.getDate();
        var fecfin = DWOtherSearcher.calendar.calfin.getDate();
        if (fecini) {
            if (!fecfin) {
                fecfin = new Date();
                fecfin.setTime(fecini.getTime() + 86400000);
            } else {
                if (DWOtherSearcher.numnoc.combo) {
                    var noc = dome.util.Common.getComboValue(DWOtherSearcher.numnoc.combo);
                    fecfin.setTime(fecini.getTime() + (noc * 86400000));

                } else if (fecfin.getTime() <= fecini.getTime()) {
                    fecfin = new Date();
                    fecfin.setTime(fecini.getTime() + 86400000);
                }
            }
            DWOtherSearcher.calendar.calfin.setDate(fecfin);
        }
    },

    /**
     * Función que se dispara cada vez que se cambia la fecha de fin.
     */
    fecfinChangeHandler: function (ev) {
        var fecini = DWOtherSearcher.calendar.calini.getDate();
        var fecfin = DWOtherSearcher.calendar.calfin.getDate();
        if (fecini && fecfin) {
            var numnoc = (fecfin.getTime() - fecini.getTime()) / 86400000;
            numnoc = Math.round(numnoc);
            var oCmb = DWOtherSearcher.numnoc.combo;
            if (oCmb) {
                if (numnoc <= DWOtherSearcher.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);
            DWOtherSearcher.calendar.calini.setDate(fecini);
        }
    },

    /**
     * Valida el formulario.
     */
    validate: function (ev) {

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

        /* 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 != DWOtherSearcher.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 = DWOtherSearcher.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["frmOtherSearcher"];

        var codzge = DWOtherSearcher.autocomplete.nomcodzge.codzge;
        if (codzge && codzge.length > 0) {
            form.elements["codzge"].value = codzge;
        }

        /* Validación */
        var error = DWOtherSearcher.validate();
        if (error && error.length > 0) {
            alert(error);
            Event.stopEvent(ev ? ev : event);
            return false;
        } else {
            DWCommon.showWaiting();
            return true;
        }
    },

    /**
     * Inicializa los componentes del buscador.
     */
    init: function () {
        /* Dependencias */
        dome.include("dome.util.Common");
        dome.include("dome.form.Autocomplete");
        dome.include("dome.form.DatePicker");

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

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

            /* Autocompletar */
            DWOtherSearcher.autocomplete.nomcodzge = new dome.form.Autocomplete(
            {
                inputField: "nomcodzgeOT",
                url: "autocomplete.do?codtse=" + DWOtherSearcher.codtse
            }
                    );

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

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

            /* Aseguramos un estado válido de los calendarios. */
            DWOtherSearcher.feciniChangeHandler();
            /* Construimos el combo de numero de noches. */
            DWOtherSearcher.buildNumnocCombo();

            var form = document.forms["frmOtherSearcher"];
            Event.addListener(form, "submit", DWOtherSearcher.submit);
            if(document.getElementById("arbol")){
                Event.addListener(form.elements["nomcodzgeOT"], "click", DWOtherSearcher.mostrarArbol);
                Event.addListener(form.elements["nomcodzgeOT"], "keyup", DWOtherSearcher.contArbolLeter);
                Event.addListener(form.elements["nomcodzgeOT"], "blur", DWOtherSearcher.startCountDown);
                Event.addListener(document.getElementById("arbol"), "mouseover", DWOtherSearcher.stopCountDown);
                Event.addListener(document.getElementById("arbol"), "mouseout", DWOtherSearcher.startCountDown);
            }
        }
    },

    /**
     * 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("divNumnocOT");
        if (DWOtherSearcher.numnoc.nocmax) {
            var oPrg = document.createElement("p");
            var oLabel = document.createElement("label");
            oLabel.className = "nombreCampoHome";
            Dom.appendChild(oLabel, document.createTextNode("Días:"));

            var oCmb = document.createElement("select");
            for (var i = 1; i <= DWOtherSearcher.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", DWOtherSearcher.numnocChanged);

            Dom.appendChild(oPrg, oLabel);
            Dom.appendChild(oPrg, oCmb);
            Dom.appendChild(div, oPrg);

            DWOtherSearcher.numnoc.combo = oCmb;

            /* Inicializar */
            var fecini = DWOtherSearcher.calendar.calini.getDate();
            var fecfin = DWOtherSearcher.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 = DWOtherSearcher.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) {
                    DWOtherSearcher.calendar.calfin.setDate(fecfin);
                }
            } else {
                target.value = "1";
                alert("No se ha informado la fecha de salida");
            }
        }
    },

    /**
     * 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){
                DWOtherSearcher.ocultarArbol();
                DWOtherSearcher.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;
        var aux = id.split("#");
        var obj = document.getElementById(aux[1]);
        if(obj.style.display != "none"){
            obj.style.display = "none";
        }else{
            obj.style.display = "block";
        }
        Event.stopEvent(ev);
        DWOtherSearcher.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;
        var aux = id.split("#");
        document.forms["frmOtherSearcher"].elements["codzge"].value = aux[0];
        document.forms["frmOtherSearcher"].elements["nomcodzge"].value = aux[1];
        document.getElementById("nomcodzgeOT").value = aux[1];
        DWOtherSearcher.ocultarArbol();
    },

    /**
     * funcion que inicializa un contador si se ha salido del arbol
     */
    startCountDown : function(){
        if (!DWOtherSearcher.cont) {
            DWOtherSearcher.cont = setTimeout(function () {DWOtherSearcher.ocultarArbol();},3000);
        }
    },

    /**
     * funcion que resetea el contador del arbol
     */
    stopCountDown : function(){
        clearTimeout(DWOtherSearcher.cont);
        DWOtherSearcher.cont = null;
    }

};

(function () {
    dome.include("dome.util.Event");

    dome.util.Event.onDomReady(DWOtherSearcher.init);
})();

