// App Buscador
buscador = function(){
    //configuraciones
    var agente = "tol";
    var pathImages = "../tol_skin/css/images/";
    var urlXml =  "http://www.ticketonline.com.ar/TOLWeb/services/localizedParadas.seam?agente="+agente+"&locale=";
    
    //$.cookie("GUEST_LANGUAGE_ID","es_AR"); //Setea cookie "GUEST_LANGUAGE_ID"

    //inicio de app
    function init(){
        $("#languageId").change(function(){
            $(".destacadas").remove();
            $( "#origen,#destino" ).unbind("click");
            $( "#buscar" ).unbind("click");
            seleccionarIdioma($(this).val());
            
        });

        if(agente!="voy") 
            $("#agente").parent().remove();

        $("#agente").change(function(){
            if($(this).is(":checked"))
                agente = "ami";
            else
                agente = "voy";

        });

        if($.cookie("GUEST_LANGUAGE_ID")){
            seleccionarIdioma($.cookie("GUEST_LANGUAGE_ID"));
            $(".lang").remove();           
        }else{
            seleccionarIdioma($("#languageId").val());
        }

        validarForm();
        winModal();
    }

    function winModal(){

        $(".winModal").click(function(event){
            event.preventDefault();
            var vars = $(this).attr("rev").split(",");
            var item = {
                id: "win"+$(this).attr("id"),
                title: $(this).attr("title"),
                url: $(this).attr("href"),
                width: vars[0],
                height: vars[1],
                position: vars[2],
                drag: (vars[3]=="true") ? true:false,
                modal: (vars[4]=="true") ? true:false

            };
            var modal = $("<div id='"+item.id+"' title='"+ item.title +"'>"
                    + "<iframe align='middle' width='100%' scrolling='no' height='100%' frameborder='0' marginwidth='0' marginheight='0' id='adpiframe' name='adpiframe' "
                    + "src='"+ item.url +"'></iframe></div>");
            if($("#"+item.id).length)    
                $("#"+item.id).remove();     
            
            $("body").append(modal);
        
            var winModal = $("#"+item.id);
            winModal.dialog({
                autoOpen: false,
                height: item.height,
                width: item.width,
                modal: item.modal,
                draggable: item.drag,
                resizable: false,
                position: item.position
            });
            if(item.position == "item"){
                var x = $(this).position().left + $(this).outerWidth();
                var y = $(this).position().top - $(document).scrollTop();
                winModal.dialog('option', 'position', [x,y]);
            }
            winModal.dialog( "widget" ).addClass("winModalWidget");
            winModal.dialog("open");
        });
    }

    /********* Entorno del Buscador **********/
    function entorno(xml){       
        $("label[for=origen]").text($("paradas", xml).find("origen").text());
        $("label[for=destino]").text($("paradas", xml).find("destino").text());
        $("p.planviaje").html($("paradas", xml).find("planviaje").text());
        $("label[for=salida]").text($("paradas", xml).find("salida").text());
        $("label[for=regreso]").text($("paradas", xml).find("regreso").text());
        $("label[for=ida]").text($("paradas", xml).find("ida").text());
        $("label[for=vuelta]").text($("paradas", xml).find("vuelta").text());
    }
    /*****************************************/

    /********* Auto Completado y validacion de Ciudad **********/
    function autoCompletar(xml){   
        var labelDestacada = $("paradas>labelDestacada", xml).text();
        var textErrorCiudad = $("paradas>textErrorCiudad", xml).text();
        var textEscriba = $("paradas>textEscriba", xml).text();
        var textVerDestacadas = $("paradas>textVerDestacadas", xml).text();
        
        var data = $("paradas", xml).find("parada").map(function() {
            return {
                label: $( this ).attr('nombre'),
                id: $( this ).attr('codigo')
            };
        }).get();

        var menus = {
            dropDown: function(item){
                var position = $(item).position();
                var id = "menu_"+$(item).attr("id");
                var ptop = parseInt(position.top)-10; 
                var left = parseInt(position.left) - 10;
                var bot = ptop + 130; 
                var right = parseInt(position.left) + $(item).width() + 25;
                var html = $("<div class='ui-autocomplete ui-menu ui-widget ui-widget-content .ui-corner-bottom " + id + "'"
                    + "style='z-index: 1; top: "+ (position.top + $(item).height()+10) +"px; left: "+ position.left +"px;"
                    + "width: "+ ($(item).width()) +"px'>"
                    + "<p class='ui-widget'>"+textEscriba+"</p>"
                    + '<button class="ui-state-default ui-corner-all" type="button" id="verCiudades">'+textVerDestacadas+'</button>'
                    + "</div>");
                $(html).hide();  
                    
                setTimeout(function(){
                    $("#verCiudades",html).hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")}); 
                    $("#verCiudades",html).unbind("click").bind("click",function(){
                        menus.destacadas($(item).attr("id"));
                    });          
                },1);
                
                $(document).mousemove(function(e){
                    if(e.pageX<left || e.pageX>right || e.pageY>bot || e.pageY<ptop)
                         $(".menu_"+$(item).attr("id")).remove();
                }); 
                
                if($("."+id).length == 0){
                    $("#mensajes").append(html)
                    $("."+id).slideDown("fast");
                    $(item).focus();
                }      
            },
            destacadas: function(id){
                var position = $("#"+id).position();
                var htmldest = $("<div class='ui-autocomplete ui-menu ui-widget ui-corner-all destacadas destacadas_" + id + "'"
                    + "style='top: "+ position.top +"px; left: "+ (10+position.left+ $("#"+id).width())+"px;'><div class='ui-widget-header ui-corner-all'>"
                    + '<a class="ui-state-default ui-corner-all close"><span class="ui-icon ui-icon-close"></span></a>'
                    + "<div class='title'>"+labelDestacada+"</div></div>"
                    + '<ul class="ui-widget ui-widget-content ui-corner-all lista-destacada"><ul>'
                    + "</div>");
                var lista = $("paradas>destacada",xml).map(function(){
                    return'<li class="ui-menu-item"><a class="ui-corner-all" id="'+$(this).attr("codigo")+'">'+$(this).attr("nombre")+'</a></li>';
                }).get().join("");

                $(".destacadas").remove();
                $(htmldest).hide();
                       
                setTimeout(function(){  
                   $(".close",htmldest).hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")}); 
                   $(".close, .title",htmldest).click(function(){
                        $(".destacadas_"+id).remove();
                   });
                   
                   $(".lista-destacada",htmldest).html(lista);
                   
                   $(".lista-destacada li",htmldest).hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")}); 
                   $(".lista-destacada li",htmldest).click(function(){
                        $("#"+id).val($("a",this).text());
                        $("#"+id+"Id").val($("a",this).attr("id"));
                        menus.cerrar($("#"+id));
                   });          
                },1);
                
                if($("."+id).length == 0){
                    $("#mensajes").append(htmldest); 
                    $(".destacadas_"+id).slideDown("fast");
                    $("#"+id).focus();
                }      
            },
            cerrar: function(item){
                $(".err-"+$(item).attr("id")).remove(); 
                $(item).removeClass("input-error");
                $(".destacadas").remove();
                $(".menu_"+$(item).attr("id")).remove();

                if($(item).attr("id")=="origen")
                    $( "#destino" ).removeAttr("disabled").focus();
                else
                    $( "#salida" ).focus();
                 validarForm();    
            }     
        };

        if($("#origen").hasClass("input-error") || $("#origen").val()=='') $( "#destino" ).attr("disabled","disabled");
        $( "#origen,#destino" ).bind("click",function(){menus.dropDown(this)});
        
        $( "#origen,#destino" ).autocomplete("destroy").autocomplete({
            source: data, minLength: 0, delay: 0, minLength: 2, autoFill: true,
            close: function(){
               var inListado = false;
                var val = $(this).val();
                var text = textErrorCiudad.replace("\\#\\",'"'+val+'"');

                $.each(data,function(index, item){if(val == item.label) inListado = true});
                if(inListado)
                    menus.cerrar(this);
                else{
                    $(this).displayError(text);
                    if($(this).attr("id")=="origen")
                        $( "#destino" ).attr("disabled","disabled");
                }
            },
            select: function( event, ui ) {
                $( "#"+$(this).attr("id")+"Id" ).val( ui.item.id );
            }
        });

        $( "#origen,#destino" ).keyup(function(){
            var text = textErrorCiudad.replace("\\#\\",'"'+$(this).val()+'"');
            if( $(".err-"+$(this).attr("id")).length )
                $(this).displayError(text);
        });
        
        $( "#origen,#destino" ).change(function(){
            var text = textErrorCiudad.replace("\\#\\",'"'+$(this).val()+'"');
            var inListado = false;
            for(var i in data){
                if(data[i].label == $(this).val()){
                    inListado = true;
                    $("#"+$(this).attr("id")+"Id").val(data[i].id);
                    break;
                }                    
            }
            if(!inListado)
                $(this).displayError(text);
            else
                menus.cerrar(this);  
        });      
    }
    /***********************************************************/
    
    /********* Calendario y validacion de fechas **********/
    function salidaRegreso(xml){
        var actualMesAno = $("paradas", xml).attr("mesano");
        var fechaActual = $("paradas", xml).attr("dia") +"/"+ ( parseInt(actualMesAno.split(":")[0])+1) + "/" + actualMesAno.split(":")[1];
        var ultimoMesAno = $("paradas>mes:last", xml).attr("codigo");
        var maxDate = $("paradas>mes:last>day:last", xml).attr("codigo") + "/" + ( parseInt(ultimoMesAno.split(":")[0])+1) + "/" + ultimoMesAno.split(":")[1];
        var minDate = fechaActual;
        var lang = []; lang["es_AR"] = "es"; lang["en_US"] = "en-GB"; lang["pt_BR"] = "pt-BR"; lang["fr_FR"] = "fr"; lang["de_DE"] = "de";
        var isIdaVuelta = false;
        var setTimeoutRegreso;
            
        var datos = {
            selectDia: function(dia,mesano){
                return $("paradas>mes[codigo='"+ mesano +"']>day", xml).map(function(){
                    if($(this).attr("codigo") == dia)  return "<option value='"+ $(this).attr("codigo") +"' selected='selected'>" + $(this).attr("codigo") + "</option>";
                    else return "<option value='"+ $(this).attr("codigo") +"'>" + $(this).attr("codigo") + "</option>";
                }).get().join("");
            },
            selectMesAnio: function(mesano){
                return $("paradas>mes", xml).map(function(){
                    if(mesano == $(this).attr("codigo")) return "<option value='"+ $(this).attr("codigo")+"' selected='selected'>" + $(this).attr("nombre") + "</option>";
                    else return "<option value='"+ $(this).attr("codigo")+"'>" + $(this).attr("nombre") + "</option>";   
                }).get().join("");
            },
            textName: function(dia,mesano){return $("paradas", xml).find("mes[codigo='"+mesano+"']>day[codigo="+parseInt(dia) + "]").attr("nombre");},
            parsearFecha: function(prefijo, dateText){
                var atual = (prefijo == "#salida") ? minDate:fechaActual;

                var mDate = (datos.isMayor(atual,dateText)) ? atual:dateText;

                if(prefijo == "#salida") fechaActual = mDate;

                var date = mDate.split("/");
                var dia = parseInt(date[0],10);
                var mesano = (parseInt(date[1])-1) + ":" +date[2];

                $(prefijo+"Name").text( datos.textName(dia, mesano) );
                $(prefijo+"Dia").html( datos.selectDia(dia, mesano) );
                $(prefijo+"MesAnio").html( datos.selectMesAnio(mesano) );
                $(prefijo).val(mDate);
                return false;
            },
            datePickerRegreso: function(dateText, focus){
                var focus = (focus==undefined) ? null:focus;
                var mDate = (datos.isMayor(fechaActual,dateText)) ? fechaActual:dateText;
                
                if(datos.isMayor(mDate, $("#regreso").val())){
                    datos.parsearFecha("#regreso", dateText);
                    $("#regreso").val(dateText);
                }
                $("#regreso").datepicker( "destroy").datepicker({
                    minDate: mDate,
                    onSelect: function(dateText, inst) {
                        datos.parsearFecha("#regreso",dateText);
                        validarForm();
                    }
                });
                if(focus) setTimeoutRegreso = setTimeout(function(){$("#regreso").focus();},1);
            },
            isMayor: function(fecha1, fecha2){
                // retorno verdadero si fecha1 es mayor que fecha2
                var fecha1Arr = fecha1.split("/");
                var fecha1Date = new Date( parseInt(fecha1Arr[2]), parseInt(fecha1Arr[1])-1, parseInt(fecha1Arr[0]));
                var fecha2Arr = fecha2.split("/");
                var fecha2Date = new Date( parseInt(fecha2Arr[2]), (parseInt(fecha2Arr[1])-1), parseInt(fecha2Arr[0]));

                if((fecha2Date.getTime() - fecha1Date.getTime())<0)
                    return true
                else return false
            }

        };

        if($("#vuelta").attr("checked")!="checked") $("#regresoDia,#regresoMesAnio").attr("disabled","disabled");
        else isIdaVuelta = true;

        datos.parsearFecha("#salida",fechaActual);
        datos.parsearFecha("#regreso",fechaActual); 

        $("input[name=radio]").change(function(){
            if($("#vuelta").attr("checked")=="checked"){
                $("#regresoDia,#regresoMesAnio").removeAttr("disabled");
                datos.parsearFecha("#regreso", fechaActual);
                datos.datePickerRegreso(fechaActual);
                isIdaVuelta = true;
                $("#regreso").datepicker( "enable" )
            }else{
                $("#regresoDia,#regresoMesAnio").attr("disabled","disabled");
                $("#regreso").datepicker( "disable" );
                isIdaVuelta = false;
            }
        });
            
        

        $.datepicker.setDefaults( $.datepicker.regional[ lang[$("paradas>but", xml).text()] ] );
        $.datepicker.setDefaults({dateFormat:"dd/mm/yy",minDate: minDate, maxDate: maxDate, numberOfMonths: 2, showButtonPanel: true,showOn: "both",buttonImage: pathImages+"calendar.png",buttonImageOnly: true});

        $("#salida").val(minDate).datepicker( "destroy" ).datepicker({
            onSelect: function(dateText, inst) {
                var prefijo = "#salida";
                datos.parsearFecha(prefijo,dateText);
                if(isIdaVuelta)
                    datos.datePickerRegreso(dateText,true);
                validarForm();
            }
        });
         $("#regreso").val(minDate).datepicker( "destroy" ).datepicker({
            onSelect: function(dateText, inst) {
                var prefijo = "#regreso";
                datos.parsearFecha(prefijo,dateText);
                clearTimeout(setTimeoutRegreso);
                validarForm();
            }
        });

        if(!isIdaVuelta) $("#regreso").val(minDate).datepicker("disable");
             

        $("#salidaDia,#salidaMesAnio").change(function(){
            var mesano = $("#salidaMesAnio").val().split(":")
            var fecha = $("#salidaDia").val() + "/" + ( parseInt(mesano[0])+1) + "/" + mesano[1];

            datos.parsearFecha("#salida",fecha);

            if(isIdaVuelta){
                datos.datePickerRegreso(fecha);
                $("#regreso").focus();
            }
            validarForm();
        });
        $("#regresoDia,#regresoMesAnio").change(function(){
            var mesano = $("#regresoMesAnio").val().split(":")
            var fecha = $("#regresoDia").val() + "/" + ( parseInt(mesano[0])+1) + "/" + mesano[1];
            datos.parsearFecha("#regreso",fecha);
            validarForm();
        });   
    }
    /******************************************************/

    /********* Validacion de Formulario **********/
    function validarForm(){
        var origen = ($("#origen").val() != '' && !$("#origen").hasClass("input-error")) ? true : false;
        var destino = ($("#destino").val() != '' && !$("#destino").hasClass("input-error") && $("#destino").val() != $("#origen").val()) ? true : false;
        
        if(!destino && origen) $("#destino").addClass("input-error");
        
        //retorna valor final
        if(origen && destino){
            $("#buscar").removeClass("ui-state-disabled");
            return true;
        }else{
            $("#buscar").addClass("ui-state-disabled");
            return false;
        }
    };
    /*********************************************/

    /********* Captura de datos y envio de Formulario **********/
    function enviarFormulario(xml){
        var lang = [];lang["es_AR"] = "es_AR"; lang["en_US"] = "en"; lang["pt_BR"] = "pt"; lang["fr_FR"] = "fr"; lang["de_DE"] = "de";

        $("#buscar").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")}); 
        $("#buscar").click(function(){
            if(validarForm()){
                //si todo el el formulario es valido
                var origenId    = $("#origenId").val();
                var destinoId   = $("#destinoId").val();
                var fechaIda    = $("#salidaDia").val()+"@"+$("#salidaMesAnio").val();
                var fechaVuelta = ($("#vuelta").attr("checked")=="checked") ? $("#regresoDia").val()+"@"+$("#regresoMesAnio").val(): fechaIda;
                var idaVuelta   = ($("#vuelta").attr("checked")=="checked") ? "true": "false";
                var locale = lang[$("paradas>but", xml).text()];

                var url = $("paradas>url",xml).text()+"helperBanner.seam?origenId="+origenId+"&destinoId="+destinoId+"&fechaIda="+fechaIda
                    +"&fechaVuelta="+fechaVuelta+"&idaVuelta="+idaVuelta+"&agente="+agente+"&locale="+locale;
                //console.log(url);
                //location.href = url;

                $(location).attr('href',url);
            }
        });          
    }
    /***********************************************************/

    /********* Cambio de Idioma **********/
    function seleccionarIdioma(lang){
        $("#imgLang").attr("src",pathImages+lang+".png");
        $("#buscar").attr("src",pathImages+"but_"+lang+".jpg");
        $.ajax({
            url: urlXml + lang,
            dataType: "xml",
            success: function(xmlResponse) {
                entorno(xmlResponse);
                autoCompletar(xmlResponse);
                salidaRegreso(xmlResponse);
                enviarFormulario(xmlResponse);
            }
        });
    }
    /*************************************/

    return init;
}();

$(function() {
    buscador();
});

/********* Configuraciones de UI jQuery **********/

/**
 * jQuery Cookie plugins
 */
$.cookie = function (key, value, options) {
    var cookie_encode = function(string){
        var decoded = encodeURIComponent(string);
        return decoded.replace(/(%7B|%7D|%3A|%22|%23|%5B|%5D)/g,function(charater){return decodeURIComponent(charater);});
        
    }
    if (arguments.length > 1 && String(value) !== "[object Object]") {
        options = jQuery.extend({}, options);
        if (value === null || value === undefined) {
            options.expires = -1;
        }
        if (typeof options.expires === 'number') {
            var days = options.expires, t = options.expires = new Date();
            t.setDate(t.getDate() + days);
        }
        value = String(value);
        return (document.cookie = [
            encodeURIComponent(key), '=',
            options.raw ? value : cookie_encode(value),
            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''));
    }
    options = value || {};
    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};


$.ui.autocomplete.prototype._renderItem = function (ul, item) {    
    var quest = this.term.toLowerCase();
    var label = item.label.substring(0,quest.length).toLowerCase();
    var reemplazar = function(text, val){
        return text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(val) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
    }
    if(quest == label){
        item.label = reemplazar(item.label, this.term);
        if($("li.pri",ul).length)
            return $("li.pri:last",ul).after($("<li class='pri'><a>" + item.label + "</a></li>")
            .data("item.autocomplete", item));
        else
            return $(ul).prepend($("<li class='pri'><a>" + item.label + "</a></li>")
            .data("item.autocomplete", item));
    }else{
        item.label = reemplazar(item.label,this.term);
        return $(ul).append($("<li><a>" + item.label + "</a></li>")
            .data("item.autocomplete", item));
    }
};

$.fn.displayError = function(text){
    var id = "err-"+$(this).attr("id");
    var position = $(this).position();
    var html = "<div class='ui-widget "+ id +"'><div class='ui-state-error ui-corner-all' style='position:absolute;padding: 0 .7em; z-index: auto; top: "+ (position.top - 5)+"px; left: "+ (position.left + $(this).width()+10)+"px;"
        + "width: 180px;'><p><span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span><strong>Alert:</strong> "
        + "<span class='text'>"+text+"</span></p></div></div>";

    if($("."+id).length == 0){
        $("#mensajes").append(html);
        $(this).addClass("input-error");
    }else 
        $("."+id+" .text").text(text);
};
/*************************************************/
