﻿window.BuscaMapaBox = {
    DivID: null,
    Map: null,
    Refreshing: false,
    Moving: false,
    RefreshTimeoutController: null,
    RefreshData: null,
    IdTipoIntercambio: 0,
    IdTipoProduto: 0,
    AjusteLatitude: 0.01,
    AjusteLongitude: 0.006,
    ComportamentoLanding: false,
    ComportamentoHome: false,
    WindowData: function(zoomLevel, latitudeMinima, longitudeMinima, latitudeMaxima, longitudeMaxima)
    {
        this.zoomLevel = zoomLevel;
        this.latitudeMinima = Math.max(parseFloat(latitudeMinima) - BuscaMapaBox.AjusteLatitude, -90);
        this.longitudeMinima = Math.max(parseFloat(longitudeMinima) - BuscaMapaBox.AjusteLongitude, -180);
        this.latitudeMaxima = Math.min(parseFloat(latitudeMaxima) + BuscaMapaBox.AjusteLatitude, 90);
        this.longitudeMaxima = Math.min(parseFloat(longitudeMaxima) + BuscaMapaBox.AjusteLongitude, 180);
    },
    SetZoomStyle: function(zoomLevel)
    {
        var style = zoomLevel <= 2 ? 'zoom1' :
            zoomLevel <= 4 ? 'zoom2' :
            zoomLevel <= 6 ? 'zoom3' :
            zoomLevel <= 8 ? 'zoom4' :
            zoomLevel <= 10 ? 'zoom5' :
            zoomLevel <= 12 ? 'zoom6' :
            zoomLevel <= 14 ? 'zoom7' :
            zoomLevel <= 16 ? 'zoom8' : 'zoom9';
        $Get('dimZoomLevel').className = style;
    },
    SetMapLayer: function()
    {
        BuscaMapaBox.Map.SetMapType(Tesla.Map.MapTypes.Street);
    },
    SetSatelliteLayer: function()
    {
        BuscaMapaBox.Map.SetMapType(Tesla.Map.MapTypes.Satellite);
    },
    SetHybridLayer: function()
    {
        BuscaMapaBox.Map.SetMapType(Tesla.Map.MapTypes.Hybrid);
    },
    GetWindowData: function()
    {
        var map = this.Map;
        var dims = map.GetRectangle();
        var zoomLevel = map.GetZoom();
        if (zoomLevel <= 2)
            dims = { X1: -180, X2: 180, Y1: -90, Y2: 90 };
        var ret = new BuscaMapaBox.WindowData(zoomLevel, dims.X1, dims.Y1, dims.X2, dims.Y2);
        return ret;
    },
    Load: function(divID, IdTipoIntercambio)
    {
        if (this.DivID) alert('Já existe um box de busca nesta janela. Não é permitido carregar mais de um. Desculpe!');
        if (!divID) alert('divID inválido');
        this.DivID = divID;
        this.IdTipoIntercambio = IdTipoIntercambio || 0;
        this.Map = new Tesla.Map.MapControl(this.DivID);
        var map = this.Map;
        map.SetCenter(new Tesla.Map.Point(23, 0), 1);
        map.OnMove = this.OnMove;
        map.OnMarkerClick = this.OnMarkerClick;
        map.DisableToolPanel();
        //BuscaMapaBox.BeginAtualizaMapa();
        setTimeout('BuscaMapaBox.BeginAtualizaMapa()', 1000);
    },
    OnMove: function()
    {
        //if (!BuscaMapaBox.Moving)
        BuscaMapaBox.BeginAtualizaMapa();
    },
    OnMarkerClick: function(obj)
    {
        BuscaMapaBox.SelectItem(obj.Data.Tipo, obj.Data.Latitude, obj.Data.Longitude, obj.Data);
    },
    BeginAtualizaMapa: function()
    {
        if (this != BuscaMapaBox) alert('invalid instance');
        if (BuscaMapaBox.Refreshing) return;
        BuscaMapaBox.ClearTimeoutHandler();
        BuscaMapaBox.Refreshing = true;
        BuscaMapaBox.RefreshTimeoutController = setTimeout('BuscaMapaBox.RefreshTimeoutHandler()', 10000);
        var dados = this.GetWindowData();
        this.RefreshData = { Window: dados };
        if (dados.zoomLevel < 3)
        {
            //Continentes
            Ajax.BuscaMapa.ListaContinentes(BuscaMapaBox.IdTipoIntercambio, BuscaMapaBox.IdTipoProduto, this.EndAtualizaMapa);
        }
        else if (dados.zoomLevel < 4 || BuscaMapaBox.IdTipoIntercambio == 2 || (BuscaMapaBox.IdTipoIntercambio == 1 && BuscaMapaBox.IdTipoProduto == 2))
        {
            //Paises
            Ajax.BuscaMapa.ListaPaises(dados.latitudeMinima, dados.longitudeMinima, dados.latitudeMaxima, dados.longitudeMaxima, this.IdTipoIntercambio, this.IdTipoProduto || 0, this.EndAtualizaMapa);
        }
        /*
        else if (dados.zoomLevel < 7)
        {
        //Regioes
        Ajax.BuscaMapa.ListaRegioes(dados.latitudeMinima, dados.longitudeMinima, dados.latitudeMaxima, dados.longitudeMaxima, this.IdTipoIntercambio, this.EndAtualizaMapa);
        }
        */
        else if (dados.zoomLevel < 10 || BuscaMapaBox.IdTipoIntercambio != 1 || BuscaMapaBox.IdTipoProduto == 2) //Tipo de intercambio definido e diferente de estudo
        {
            //Cidades
            Ajax.BuscaMapa.ListaCidades(dados.latitudeMinima, dados.longitudeMinima, dados.latitudeMaxima, dados.longitudeMaxima, this.IdTipoIntercambio, this.IdTipoProduto || 0, this.EndAtualizaMapa);
        }
        else if ((BuscaMapaBox.IdTipoIntercambio == 1 || BuscaMapaBox.IdTipoIntercambio == 0))
        {
            //Centros
            Ajax.BuscaMapa.ListaCentros(dados.latitudeMinima, dados.longitudeMinima, dados.latitudeMaxima, dados.longitudeMaxima, this.IdTipoIntercambio, this.EndAtualizaMapa);
        }
        else
        {
            BuscaMapaBox.ClearTimeoutHandler();
        }
    },
    RefreshTimeoutHandler: function()
    {
        if (BuscaMapaBox.Refreshing)
        {
            alert("Não foi possível processar sua requisição no momento. Aguarde alguns instantes e tente novamente.");
        }
        BuscaMapaBox.Refreshing = false;
    },
    ClearTimeoutHandler: function()
    {
        clearTimeout(BuscaMapaBox.RefreshTimeoutController);
        BuscaMapaBox.Refreshing = false;
    },
    EndAtualizaMapa: function(ret)
    {
        BuscaMapaBox.AtualizaMapa(ret);
    },
    AtualizaMapa: function(ret)
    {
        if (!BuscaMapaBox.Refreshing) return;
        var map = this.Map;
        map.ClearMarkers();
        var icon = new Tesla.Map.MarkerIcon(page.ResolveUrl('~/images/Geral/ico_mapa_generico.gif'), new Tesla.Map.Size(16, 16), new Tesla.Map.Point(5, 5), null, null);
        for (var i = 0; i < ret.length; i++)
        {
            var marker = new Tesla.Map.Marker(map, new Tesla.Map.Point(ret[i].LatitudeMapa, ret[i].LongitudeMapa), icon);
            marker.Data = ret[i];
            var idTipoIntercambio = BuscaMapaBox.IdTipoIntercambio || 0;
            var idTipoProduto = BuscaMapaBox.IdTipoProduto || 0;
            var imagem = 'ico_mapa_geral.gif';
            var path = page.ResolveUrl('~/images/Geral/');
            switch (parseInt(idTipoIntercambio))
            {
                case 1:
                    imagem = 'ico_mapa_estudo.gif';
                    if (idTipoProduto == 2)
                        imagem = 'ico_mapa_ensinomedio.gif';
                    break;
                case 2:
                    imagem = 'ico_mapa_trabalho.gif';
                    break;
                case 3:
                    imagem = 'ico_mapa_turismo.gif';
                    break;
            }
            marker.Icon = new Tesla.Map.MarkerIcon(path + imagem, new Tesla.Map.Size(32, 32), new Tesla.Map.Point(16, 16));
            map.AddMarker(marker);
        }
        BuscaMapaBox.SetZoomStyle(this.GetWindowData().zoomLevel);
        BuscaMapaBox.ClearTimeoutHandler();
    },
    IncreaseZoom: function()
    {
        var zoomLevel = this.GetWindowData().zoomLevel;
        zoomLevel = Math.min(19, zoomLevel + 1);
        this.Map.SetZoom(zoomLevel);
    },
    DecreaseZoom: function()
    {
        var zoomLevel = this.GetWindowData().zoomLevel;
        zoomLevel = Math.max(0, zoomLevel - 1);
        this.Map.SetZoom(zoomLevel);
    },
    ResetZoom: function()
    {
        var center = this.Map.GetCenter();
        center.Latitude = 23;
        center.Longitude = 0;
        this.Map.SetCenter(center);
        setTimeout('BuscaMapaBox.Map.SetZoom(1);', 1000);
    },
    SelectItem: function(itemType, latitude, longitude, itemData)
    {
        var zoomLevel = 3;
        switch (itemType)
        {
            case 0:
                zoomLevel = 1;
                break;
            case 1:
                zoomLevel = 3;
                break;
            case 2:
                zoomLevel = 4;
                break;
            case 3:
                zoomLevel = 10;
                break;
            case 4:
                zoomLevel = 12;
                break;
            case 5:
                zoomLevel = 14;
                break;
        }
        var center = this.Map.GetCenter();
        center.Latitude = latitude;
        center.Longitude = longitude;
        BuscaMapaBox.Moving = true;
        var zoomLevelAtual = BuscaMapaBox.Map.GetZoom();
        if (zoomLevel > zoomLevelAtual)
            this.Map.SetCenter(center, zoomLevel);
        else
            this.Map.SetCenter(center);
        setTimeout('BuscaMapaBox.Moving = false;', 100);
        if (this.OnSelectItem) this.OnSelectItem(itemType, latitude, longitude, itemData);
    },
    MoveFocus: function(dirUp, dirRight)
    {
        var factor = Math.max(10 - this.Map.GetZoom(), 1);
        dirRight = (dirRight / factor).toFixed(2);
        dirUp = (dirUp / factor).toFixed(2);
        var center = this.Map.GetCenter();
        var win = this.GetWindowData();
        var nextLatMax;
        var nextLngMax;
        var nextLatMin;
        var nextLngMin;

        nextLatMax = win.latitudeMaxima + (dirUp * (win.latitudeMaxima - win.latitudeMinima));
        nextLngMax = win.longitudeMaxima + (dirRight * (win.longitudeMaxima - win.longitudeMinima));
        nextLatMin = win.latitudeMinima + (dirUp * (win.latitudeMaxima - win.latitudeMinima));
        nextLngMin = win.longitudeMinima + (dirRight * (win.longitudeMaxima - win.longitudeMinima));

        center.Latitude += (dirUp * (win.latitudeMaxima - win.latitudeMinima));
        center.Longitude += (dirRight * (win.longitudeMaxima - win.longitudeMinima));
        this.Map.SetCenter(center);
    },
    OnDdlTipoIntercambio: function(combo)
    {
        BuscaMapaBox.IdTipoIntercambio = combo.SelectedValue();
        BuscaMapaBox.BeginAtualizaMapa();
        if (BuscaMapaBox.OnChangeTipoIntercambio) BuscaMapaBox.OnChangeTipoIntercambio(combo);
    },
    OnChangeTipoIntercambio: function(combo)
    {
    },
    RedirectPaginaInterna: function(itemType, latitude, longitude, itemData)
    {
        if (itemType == 1) return;
        var url = page.ResolveUrl('~/aspx/Produtos/ResultadoBuscaMapa.aspx');
        url += '?';
        url += 'type=' + itemType.toString() + '&';
        url += 'latitude=' + latitude.toFixed(8).replace(',', '.') + '&';
        url += 'longitude=' + longitude.toFixed(8).replace(',', '.') + '&';
        url += 'id=' + itemData.IdItemBuscaMapa.toString() + '&';
        if (BuscaMapaBox.IdTipoIntercambio != 0)
            url += 'IdTipoIntercambio=' + BuscaMapaBox.IdTipoIntercambio.toString() + '&';
        if (BuscaMapaBox.IdTipoProduto != 0)
            url += 'IdTipoProduto=' + BuscaMapaBox.IdTipoProduto.toString();
        location.href = url;
    },
    OnSelectItem: function(itemType, latitude, longitude, itemData)
    {
        return true;
    },
    SetLandingBehavior: function()
    {
        BuscaMapaBox.ComportamentoLanding = true;
        BuscaMapaBox.OnSelectItem = BuscaMapaBox.RedirectPaginaInterna;
    },
    SetHomeBehavior: function()
    {
        BuscaMapaBox.ComportamentoHome = true;
        BuscaMapaBox.OnSelectItem = BuscaMapaBox.RedirectPaginaInterna;
    },
    SetText: function(txt)
    {
        page.BoxBuscaMapaControls_h3Localidade.innerHTML = txt;
    },
    InitScreen: function(itemType, latitude, longitude, id, text)
    {
        setTimeout('BuscaMapaBox.BeginAtualizaMapa();', 6000);
        BuscaMapaBox.SetText(text);
        BuscaMapaBox.SelectItem(itemType, latitude, longitude, { 'IdItemBuscaMapa': id });
    }
}