﻿/*************************************************************************************************************************************************/
/*                                                                  INIT                                                                         */
/*************************************************************************************************************************************************/

function init()
{
    if (globalVariablesInitialized == false)
    {
        if($('txtSite').value.toString().toLowerCase() == "buscape")
        {
            initializeGlobalVariables('BuscaPe/Aereo');
        }
        else if($('txtSite').value.toString().toLowerCase() == "buscatrip")
        {
            initializeGlobalVariables('BuscaTrip/Aereo');
        }
    }
}    

/*************************************************************************************************************************************************/
/*                                                           VARIÁVEIS GLOBAIS                                                                   */
/*************************************************************************************************************************************************/

// mensagens 
var textoProcessandoBusca = "Estamos processando sua busca";
var textoFiltrandoBusca =  "Atualizando resultados";

// nº de opções por página
var pageSize = 20;

// templates
var templates = null;

// índices dos vetores controlados pelos sliders
var idxMenorSaidaIda = 0;
var idxMenorSaidaIdaSelecionada = 1;
var idxMaiorSaidaIda = 2;
var idxMaiorSaidaIdaSelecionada = 3;
var idxMenorChegadaIda = 4;
var idxMenorChegadaIdaSelecionada = 5;
var idxMaiorChegadaIda = 6;
var idxMaiorChegadaIdaSelecionada = 7;

var idxMenorSaidaVolta = 8;
var idxMenorSaidaVoltaSelecionada = 9;
var idxMaiorSaidaVolta = 10;
var idxMaiorSaidaVoltaSelecionada = 11;
var idxMenorChegadaVolta = 12;
var idxMenorChegadaVoltaSelecionada = 13;
var idxMaiorChegadaVolta = 14;
var idxMaiorChegadaVoltaSelecionada = 15;

var idxMenorDuracao = 0;
var idxMenorDuracaoSelecionada = 1;
var idxMaiorDuracao = 2;
var idxMaiorDuracaoSelecionada = 3;

var idxMenorPreco = 0;
var idxMenorPrecoSelecionado = 1;
var idxMaiorPreco = 2;
var idxMaiorPrecoSelecionado = 3;

// contexto de uma aba
var dtVariaveisDeAba = new DataTable("VariaveisDeAba");

dtVariaveisDeAba.addColumn('paginaAtual', 'System.Int32');

dtVariaveisDeAba.addColumn('listaOpcoesMPSelecionadas', 'System.Array');

dtVariaveisDeAba.addColumn('ordemCompanhiaCrescente', 'System.Boolean');
dtVariaveisDeAba.addColumn('ordemAeroportoCrescente', 'System.Boolean');
dtVariaveisDeAba.addColumn('ordemPartidaCrescente', 'System.Boolean');
dtVariaveisDeAba.addColumn('ordemChegadaCrescente', 'System.Boolean');
dtVariaveisDeAba.addColumn('ordemParadasCrescente', 'System.Boolean');
dtVariaveisDeAba.addColumn('ordemPrecoCrescente', 'System.Boolean');

dtVariaveisDeAba.addColumn('ordemColuna', 'System.Int32');

dtVariaveisDeAba.addColumn('paradas', 'System.Array');
dtVariaveisDeAba.addColumn('ciasAereas', 'System.Array');

dtVariaveisDeAba.addColumn('voosMesmoAeroporto', 'System.Boolean');

dtVariaveisDeAba.addColumn('aeroportos', 'System.Array');
dtVariaveisDeAba.addColumn('horarios', 'System.Array');
dtVariaveisDeAba.addColumn('duracao', 'System.Array');
dtVariaveisDeAba.addColumn('moeda', 'System.String');
dtVariaveisDeAba.addColumn('precos', 'System.Array');

dtVariaveisDeAba.addColumn('filtros_img_estados', 'System.Array');

dtVariaveisDeAba.addColumn('sourcesRanking', 'System.Array');

dtVariaveisDeAba.addColumn('html', 'System.String');

/*************************************************************************************************************************************************/
/*                                                           VARIÁVEIS DE ABA                                                                    */
/*************************************************************************************************************************************************/

// DataSet com os resultados da busca
var ds = null;

// iterador das opções MP
var iteratorOpcoesMP = null;

// iterador dos vôos das opções MP
var iteratorVoosOpcoesMP = null;

// lista das opções MP selecionadas
var listaOpcoesMPSelecionadas = new Array();

// iterador de cias aéreas
var iteratorCias = null;

// iterador de aeroportos
var iteratorAeroportos = null;

// página atual
var paginaAtual = 1;

// estado de ordenação por companhia dos vôos (indica se está em ordem crescente das companhias)
var ordemCompanhiaCrescente = false;
// estado de ordenação por aeroporto dos vôos (indica se está em ordem crescente dos aeroportos)
var ordemAeroportoCrescente = false;
// estado de ordenação por data de partida dos vôos (indica se está em ordem crescente das datas de partida)
var ordemPartidaCrescente = false;
// estado de ordenação por data de chegada dos vôos (indica se está em ordem crescente das datas de chegada)
var ordemChegadaCrescente = false;
// estado de ordenação por número de paradas dos vôos (indica se está em ordem crescente dos números de paradas)
var ordemParadasCrescente = false;
// estado de ordenação por preço dos vôos (indica se está em ordem crescente dos preços)
var ordemPrecoCrescente = false;

// indica a coluna que define a atual ordenação dos vôos
var ordemColuna = 6;

// filtros
var paradas = new Array();
var ciasAereas = new Array();
var voosMesmoAeroporto = false;
var aeroportos = new Array();
var horarios = new Array(16);
var duracao = new Array(4);
var moeda = "";
var precos = new Array(4);

// sliders
var sliderHorarioIda = null;
var sliderHorarioVolta = null;
var sliderDuracao = null;
var sliderPrecos = null;

// ranking de empresas por source
var sourcesRanking = new Array();
var datas = new Array();

/*************************************************************************************************************************************************/
/*                                                                  LAYOUT                                                                         */
/*************************************************************************************************************************************************/

/*************************************************************************************************************************************************/
/*                                  MÉTODOS ALTERADOS PARA GERAÇÃO DO FORMULÁRIO ESTATICAMENTE                                                    */
/*************************************************************************************************************************************************/

function carregaPaginaResultadosDeAereo()
{
    init();
}    

/*************************************************************************************************************************************************/
/*                                                              BUSCA DE VÔOS                                                                    */
/*************************************************************************************************************************************************/

function addResultadoPreco(origem, destino, data, cabine, numADT, numCHD, numINF)
{
    carregaPaginaResultadosDeAereo();
    
    var origens = new Array();
    var destinos = new Array();
    datas = new Array();
    
    origens[0] = origem;
    destinos[0] = destino;
    datas[0] = data;
    
    // verificar se ja foi validado pela Home. Se não for, executar validação
    if(QueryString("validado") == null || QueryString("validado") != "1")
    {
        validaBuscaQS();
    }
    
    getMultiVoosPreco(origens, destinos, datas, cabine, numADT, numCHD, numINF, null);
}

function addResultadoPrecoIdaVolta(origem, destino, dataIda, dataVolta, cabine, numADT, numCHD, numINF)
{
    carregaPaginaResultadosDeAereo();
    
    var origens = new Array();
    var destinos = new Array();
    var qs = $('txtUrl').value;
    
    origens[0] = origem;
    destinos[0] = destino;
    //
    datas[0] = ((dataIda) != null && (dataIda) != '' ? Date.parse(dataIda, "dd/MM/yyyy").toString("dd/MM/yyyy") :Date.now().toString("dd/MM/yyyy"));
    
    origens[1] = destino;
    destinos[1] = origem;
    datas[1] = ((dataVolta) != null && (dataVolta) != ''  ? Date.parse(dataVolta, "dd/MM/yyyy").toString("dd/MM/yyyy") :Date.now().addDays(11).toString("dd/MM/yyyy"));
     
    // verificar se ja foi validado pela Home. Se não for, executar validação
    if(QueryString_SetQS(qs, "validado") == null || QueryString_SetQS(qs, "validado") != "1")
    {
        validaBuscaQS();
    }
     
    getMultiVoosPreco(origens, destinos, datas, cabine, numADT, numCHD, numINF, null);
}

function getMultiVoosPreco(origens, destinos, datas, cabine, numADT, numCHD, numINF, tab)
{
    origensPesq = origens;
    destinosPesq = destinos;
    datasPesq = datas;
    ciaAerea = (QueryString_SetQS($('txtUrl').value, "idCia") != null ? QueryString_SetQS($('txtUrl').value, "idCia") : "");
    
    // tab a ser renderizada
    var idTabAguarde = -1;
    
    // caso não tenha informado uma tab, trata como um novo resultado
    if (tab == null)
    {
        /*******************************************************************************************************************************/
        // remove a aba de busca (caso haja)
        var searchTab = tabList.getTabByMode(AEREO, BUSCA);
        if (searchTab != null)
        {
            tabList.remove(searchTab.id);
        }

        /***************************************************************************************************************************/
        // cria uma nova aba
        idTabAguarde = tabList.getNextTabId();
        var nomeTabAguarde = "AGUARDE";

        var aguardeDS = new DataSet();
        var dtTrechos = new DataTable("Trechos");
        dtTrechos.addColumn('codTrecho', 'System.Int32');
        dtTrechos.addColumn('tipoDeBusca', 'System.String');
        dtTrechos.addColumn('origem', 'System.String');
        dtTrechos.addColumn('destino', 'System.String');
        dtTrechos.addColumn('data', 'System.DateTime');
        
        dtTrechos.addColumn('adts', 'System.int');
        dtTrechos.addColumn('chds', 'System.int');
        dtTrechos.addColumn('infs', 'System.int');
        
        for (var i = 0; i < origens.length; i++)
        {
            var drTrecho = dtTrechos.newRow();
            drTrecho.codTrecho = i + 1;
            drTrecho.tipoDeBusca = AEREO; 
            drTrecho.origem = origens[i]; nomeTabAguarde += drTrecho.origem;
            drTrecho.destino = destinos[i]; nomeTabAguarde += drTrecho.destino;
            drTrecho.data = Date.parse(datas[i], 'dd/MM/yyyy'); 
            nomeTabAguarde += drTrecho.data.toString("yyyyMMdd");
            
            drTrecho.adts = numADT;
            drTrecho.chds = numCHD;
            drTrecho.infs = numINF;
            
            dtTrechos.addRow(drTrecho);
        }
        aguardeDS.addTable(dtTrechos);

        tabList.add(new Tab(idTabAguarde, nomeTabAguarde, AEREO, RESULTADO, aguardeDS, null, function(){apresentaAguardeDeAereo();}, function(){}));

        /*******************************************************************************************************************************/
        // cria uma nova aba de busca
        var idTabBusca = tabList.getNextTabId();
        tabList.add(new Tab(idTabBusca, "", AEREO, BUSCA, null, null, function(){apresentaNovaAbaDeBusca();}, function(){}));
        
        /*******************************************************************************************************************************/
    }
    else    // caso tenha informado uma tab, apenas altera seu estado para "atualizando"
    {
        /***************************************************************************************************************************/
        // renomeia a aba para sinalizar que está sendo atualizada
        idTabAguarde = tab.id;
        var nomeTabAguarde = "AGUARDE";

        var aguardeDS = new DataSet();
        var dtTrechos = new DataTable("Trechos");
        dtTrechos.addColumn('codTrecho', 'System.Int32');
        dtTrechos.addColumn('origem', 'System.String');
        dtTrechos.addColumn('destino', 'System.String');
        dtTrechos.addColumn('data', 'System.DateTime');
        
        dtTrechos.addColumn('adts', 'System.int');
        dtTrechos.addColumn('chds', 'System.int');
        dtTrechos.addColumn('infs', 'System.int');

        for (var i = 0; i < origens.length; i++)
        {
            var drTrecho = dtTrechos.newRow();
            drTrecho.codTrecho = i + 1;
            drTrecho.origem = origens[i]; nomeTabAguarde += drTrecho.origem;
            drTrecho.destino = destinos[i]; nomeTabAguarde += drTrecho.destino;
            drTrecho.data = Date.parse(datas[i], 'dd/MM/yyyy'); 
            nomeTabAguarde += drTrecho.data.toString("yyyyMMdd");
            
            drTrecho.adts = numADT;
            drTrecho.chds = numCHD;
            drTrecho.infs = numINF;

            dtTrechos.addRow(drTrecho);
        }
        aguardeDS.addTable(dtTrechos);

        tabList.edit(idTabAguarde, new Tab(idTabAguarde, nomeTabAguarde, AEREO, RESULTADO, aguardeDS, null, function(){apresentaAguardeDeAereo();}, function(){}));
        
        /***************************************************************************************************************************/
    }
    
    // valida a exibição de tabs
    validateTabsVisibility();
    
    // exibe o resultado
    apresentaResultados(idTabAguarde);
    
    /*******************************************************************************************************************************/

    Resultado.pesqVoosPreco(origens, destinos, datas, cabine, ciaAerea, numADT, numCHD, numINF, getMultiVoosPreco_callback);
}

function getMultiVoosPreco_callback(res)
{
    var resultDataSet = null;
    
    try
    {
        // finaliza a barra de progressão
        finish_progress_bar();
    }
    catch (exProgressBar) { } 
    
    if (!res.error)
    {                      
        resultDataSet = res.value; 

        if(resultDataSet.count == 0 || resultDataSet.tables["OpcoesMP"] == null || resultDataSet.tables["OpcoesMP"].rows.count() == 0)
        {
            EscondeAguarde();
            
            alert("A pesquisa não encontrou resultados de vôos");
        }
        else
        {
//            if ($("txtSite").value == "buscatrip")
//            {
//                ExibeAguardeComThread(textoProcessandoBusca, function() {return getMultiVoosPreco_background(resultDataSet);}, true);
//            }
//            else
//            {
                var thread = new Thread();
                thread.run = function() {return getMultiVoosPreco_background(resultDataSet);};
                thread.destructor = function(){};
                thread.start();
//            }
        }  
    }
    else
    {
        EscondeAguarde();
        
        alert('Não foi possível efetuar a busca solicitada. Por favor, tente novamente.');
    }
    
    try
    {
        $('divProcessandoBusca').style.display = 'none';
    }
    catch (ex) { }
}

function getMultiVoosPreco_background(resultDataSet)
{
    try
    {
        // ordena a tabela de cias pelo menor preço
        resultDataSet.tables.Cias.sort('menorPreco');

        // orderna as opções MP pelo melhor preço
        // (ordenação padrão)
        resultDataSet.tables.OpcoesMP.sort('tarifaADT', ordemPrecoCrescente);
        
        // ordena os aeroportos pela iata da cidade
        resultDataSet.tables.Aeroportos.sort('iataCidade');

        // ordena o ranking de empresas
        resultDataSet.tables.Ranking.sort('ranking');

        /*******************************************************************************************************************************/
        // remove a aba de busca (caso haja)
        var searchTab = tabList.getTabByMode(AEREO, BUSCA);
        if (searchTab != null)
        {
            tabList.remove(searchTab.id);
        }

        // sinaliza se o tab deve ser renderizado
        var renderTab = false;
        
        var tab = null;

        /***************************************************************************************************************************/
        // tenta encontrar a aba de aguarde associada à esta busca
        var nomeTabAguarde = "AGUARDE";
        for (var i = 0; i < resultDataSet.tables["Trechos"].rows.count(); i++)
        {
            nomeTabAguarde += resultDataSet.tables["Trechos"].rows[i]["origem"];
            nomeTabAguarde += resultDataSet.tables["Trechos"].rows[i]["destino"];
            nomeTabAguarde += resultDataSet.tables["Trechos"].rows[i]["data"].toString("yyyyMMdd");
        }
        tab = tabList.getTabByName(AEREO, nomeTabAguarde);
        
        if (tab == null)
        {
            // cria uma nova aba
            var idTabResultado = tabList.getNextTabId();
            tab = new Tab(idTabResultado, "", AEREO, RESULTADO, resultDataSet, null, function(numeroTab){apresentaResultadosDeAereo(numeroTab);}, function(numeroTab){salvaContextoDaAba(numeroTab);});
            tabList.add(tab);
        }
        else
        {
            // caso a tab de resultado seja a tab renderizada, exibe o resultado
            if (tab.rendered == true)
            {
                renderTab = true;
            }
            
            var idTabResultado = tab.id;
            tab = new Tab(idTabResultado, "", AEREO, RESULTADO, resultDataSet, null, function(numeroTab){apresentaResultadosDeAereo(numeroTab);}, function(numeroTab){salvaContextoDaAba(numeroTab);});
            tabList.edit(tab.id, tab);
        }

        /*******************************************************************************************************************************/
        // cria uma nova aba de busca
        var idTabBusca = tabList.getNextTabId();
        tabList.add(new Tab(idTabBusca, "", AEREO, BUSCA, null, null, function(){apresentaNovaAbaDeBusca();}, function(){}));
        
        /*******************************************************************************************************************************/

        if (renderTab == true)
        {
            apresentaResultados(tab.id);
        }
        
        /*******************************************************************************************************************************/
    }
    catch (ex) { }

    // exibe os tabs (que podem ter sido ocultados na validação de tabs na chamada da função getMultiVoosPreco())
    showTabs();

    return true;
}

function AtualizarResultado(numeroTab) 
{
    // recupera o tab
    var tab = tabList.getTabById(numeroTab);
    
    // define os parâmetros para atualizar a tab
    var origens = new Array();
    var destinos = new Array();
    var datas = new Array();
    var cabine = "";
    var adts = new Array();
    var chds = new Array();
    var infs = new Array();
    
    origens[0] = "";
    destinos[0] = "";
    datas[0] = "";
    cabine = "";
    
    try
    {
        origens[0] = Trim(ds.tables.Trechos.rows[0]["origem"]);
        destinos[0] = Trim(ds.tables.Trechos.rows[0]["destino"]);
        datas[0] = ds.tables.Trechos.rows[0]["data"].toString("dd/MM/yyyy");
        cabine = Trim(ds.tables.Trechos.rows[0]["cabine"]);
        
        adts = Trim(ds.tables.Trechos.rows[0]["adts"]);
        chds = Trim(ds.tables.Trechos.rows[0]["chds"]);
        infs = Trim(ds.tables.Trechos.rows[0]["infs"]);
        
    }
    catch (ex) { } 
    
    // caso seja ida e volta
    if (ds.tables.Trechos.rows.count() > 1)
    {
        origens[1] = "";
        destinos[1] = "";
        datas[1] = "";

        try
        {
            origens[1] = Trim(ds.tables.Trechos.rows[ds.tables.Trechos.rows.count() - 1]["origem"]);
            destinos[1] = Trim(ds.tables.Trechos.rows[ds.tables.Trechos.rows.count() - 1]["destino"]);
            datas[1] = ds.tables.Trechos.rows[ds.tables.Trechos.rows.count() - 1]["data"].toString("dd/MM/yyyy");
        }
        catch (ex) { } 
    }

    // atualiza a tab
//    getMultiVoosPreco(origens, destinos, datas, cabine, adts, chds, infs, tab);
    getMultiVoosPreco(origens, destinos, datas, cabine, "", "", "", tab);
}

/*************************************************************************************************************************************************/
/*************************************************************************************************************************************************/

function MM_swapImgRestore() 
{ 
    //v3.0
    var i,x,a=document.MM_sr; 
    for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) 
    {
        x.src=x.oSrc;
    }
}

function MM_swapImage() 
{ 
    //v3.0
    var i,j=0,x,a=MM_swapImage.arguments; 
    document.MM_sr=new Array; 
    for(i=0;i<(a.length-2);i+=3)
    {
        if ((x=MM_findObj(a[i]))!=null)
        {
            document.MM_sr[j++]=x; 
            if(!x.oSrc) 
            {
                x.oSrc=x.src; 
            }
            x.src=a[i+2];
        }
    }
}

function MM_findObj(n, d)
{ 
    //v4.01
    var p,i,x;  
    if(!d) 
    {
        d=document; 
    }
    if((p=n.indexOf("?"))>0&&parent.frames.length) 
    {
        d=parent.frames[n.substring(p+1)].document; 
        n=n.substring(0,p);
    }
    if(!(x=d[n])&&d.all) 
    {
        x=d.all[n]; 
    }
    for (i=0;!x&&i<d.forms.length;i++) 
    {
        x=d.forms[i][n];
    }
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) 
    {
        x=MM_findObj(n,d.layers[i].document);
    }
    if(!x && d.getElementById) 
    {
        x=d.getElementById(n); 
    }
    return x;
}

function validaBuscaQS()
{
    var qs = $('txtUrl').value;
    var origem = QueryString_SetQS(qs, "origem");
    var destino = QueryString_SetQS(qs,"destino");
    var dataIda = Trim($('txtUrldataIda').value);
    var idaVolta = QueryString_SetQS(qs,"idavolta");
    var dataVolta = Trim($('txtUrldataVolta').value);
    var classe = QueryString_SetQS(qs,"classe");
    var hoje = Date.now();
    var form = $("searchForm");
    
    var data_dia = hoje.getDate() + "/" + (hoje.getMonth() + 1) + "/" + hoje.getYear(); 
    var hora_atual = hoje.getHours() + ":" + hoje.getMinutes();
    
    var dHoje = Date.parse(hoje.toString('dd/MM/yyyy'), 'dd/MM/yyyy');
    
    var dIda = null;
    var dVolta = null;
             
    if(origem == null || origem == "")
    {
        alert("Informe a localidade de origem.");
        form.submit();
        return false;   
    }
   
    if(destino == null || destino == "")
    {
        alert("Informe a localidade de destino.");
        form.submit();
        return false;
    }
        
    if (origem == destino)
    {
        alert("Origem e Destino não podem ser iguais.");
        form.submit();
        return false;
    }                              
              
    if (dataIda == null || dataIda == "")
    {
        dataIda = Date.now().addDays(3).toString("dd/MM/yyyy");
        datas[0] = dataIda.toString("dd/MM/yyyy");
    }
        
    dIda = Date.parse(dataIda, 'dd/MM/yyyy');
        
    if(!validaData(dataIda))
    {
        alert("Data de Ida Inválida.");
        form.submit();
        return false;
    }
    
    if (dataIda < dHoje)
    {
        alert("A Data de Ida deve ser maior ou igual a data atual.");
        form.submit();
        return false;
    }

    if(idaVolta == "1")
    {
        if((dataVolta == null || dataVolta == ""))
        {
            dataVolta = Date.now().addDays(11).toString("dd/MM/yyyy");
            datas[1] = dataVolta.toString("dd/MM/yyyy");
        }

        if(!validaData(dataVolta))
        {
            alert("Data de Volta Inválida.");
            form.submit();
            return false;
        }          

        dVolta = Date.parse(dataVolta, 'dd/MM/yyyy');    

        if(dVolta < dIda)
        {
            alert('A Data da Volta deve ser maior que a data de Ida.');
            form.submit();
            return false;    
        }
    }                 
    
    return true;                    
}

function validaData(date) 
{
	var array_data = new Array;
	var ExpReg = new RegExp("(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[0-9]{2}|[2-9][0-9]{3}");
	//vetor que contem o dia o mes e o ano
	array_data = date.split("/");
	erro = false;
	//Valido se a data esta no formato dd/mm/yyyy e se o dia tem 2 digitos e esta entre 01 e 31
	//se o mes tem d2 digitos e esta entre 01 e 12 e o ano se tem 4 digitos e esta entre 1000 e 2999
	if (date.search(ExpReg) == -1)
	{
		erro = true;
	}
	//Valido os meses que nao tem 31 dias com execao de fevereiro
	else if ( ( ( array_data[1] == 4 ) || ( array_data[1] == 6 ) || ( array_data[1] == 9 ) || ( array_data[1] == 11 ) ) && ( array_data[0] > 30 ) )
	{
		erro = true;
	}
	//Valido o mes de fevereiro
	else if ( array_data[1] == 2 ) 
	{
		//Valido ano que nao e bissexto
		if ( ( array_data[0] > 28 ) && ( ( array_data[2] % 4 ) != 0 ) )
		{
			erro = true;
		}
		//Valido ano bissexto
		if ( ( array_data[0] > 29 ) && ( ( array_data[2] % 4 ) == 0 ) )
		{
		    erro = true;
		}
	}
	if ( erro ) 
	{
		return false;
	}
	
	return true;
}
