var map;                        //Variable mantenedora del mapa gmap
var propiedades = new Array();  //Arreglo que mantiene las residenciales
var zoom;                       //Variable que mantiene el zoom actual del sistema
var reposicionar = true;        //Variable que mantiene la desición de reposicionar el mapa
var lugares = new Array();      //Arreglo que mantiene los lugares genéricos
var isBigMapOpen = false;       //Variable de condicion que indica si el mapa grande está abierto o no
var initLat;
var initLng;
var initZoom;
var htmlForMap;
var firstTime = true;
var marcador_clickeado;

/**
 * Deja una residencial en el arreglo general
 */
function addPropToArray(lat,lng,idLugar,nombre,img_icono)
{
    propiedades[""+idLugar+""]=createPoint(lat,lng,idLugar,nombre,img_icono);
}
function procesaTest(data)
{
    eval(data);
    var i;
    for(i=0; i<data.length; i++)
        propiedades.push(createPoint(data[i].latitud,data[i].longitud,data[i].idlugar,data[i].nombre,data[i].logo));
}

/**
 * Muestra las residenciales en el mapa
 */
function displayProp()
{
    for(key in propiedades)
    {
        propiedades[key].setMap(map);
    }

    hideMapLoader();
    if(isBigMapOpen)
    {
        $("#big_map_loader").slideUp();
        updateInfoBox();
    }
}

/**
 * Saca las residenciales del mapa
 */
function removeProps()
{
    for(key in propiedades)
    {
        propiedades[key].setMap(null);
    }

    propiedades = Array();
}

/**
 * Obtiene los puntos cercanos según el centro del mapa
 */
function getNearPoints()
{
    removeProps();
    map.closeInfoWindow();
    reposicionar = true;
    var SWlat = map.getBounds().getSouthWest().lat();
    var SWlng = map.getBounds().getSouthWest().lng();
    var NWlat = map.getBounds().getNorthEast().lat();
    var NWlng = map.getBounds().getNorthEast().lng();
    showMapLoader();
    xajax__traerlugarescercanos(SWlat,NWlat,SWlng,NWlng);

}

/**
 * Setea el centro del mapa
 */
function mapSetCenter(lat,lng,zoom)
{
    map.setCenter(new google.maps.LatLng(lat,lng,zoom));
}

/**
 * Crea un punto para residenciales
 */
function createPoint(lat, lng, idLugar, nombre, img_icono)
{

    var image = "images/mapIcons/"+img_icono+".png";
    var sombra = "images/mapIcons/logopeqsombra.png";

    point = new google.maps.LatLng(lat,lng);

    var marker = new google.maps.Marker({
            position: point,
            icon: image,
            shadow: sombra,
            title: nombre
    });

    new google.maps.event.addListener(marker,"click",function(){
        hideAllFunc();
	xajax__ver_punto_en_mapa(idLugar);
        marcador_clickeado = marker;
    });

    return marker;
}

function createSimplePoint(lat, lng, nombre)
{

    var image = "images/mapIcons/logopeq.png";
    var sombra = "images/mapIcons/logopeqsombra.png";

    point = new google.maps.LatLng(lat,lng);

    var marker = new google.maps.Marker({
            position: point,
            icon: image,
            shadow: sombra,
            title: nombre
    });

    marker.setMap(map);
    //return marker;
    
}

/**
 * Crea un marcador para lugar genérico
 */
function createGenericPoint(lat, lng, idLugar, nombre, icono, tipo)
{

    var image = "images/mapIcons/"+icono+".png";
    
    point = new google.maps.LatLng(lat,lng);

    var marker = new google.maps.Marker({
            position: point,
            icon: image,
            title: nombre
    });

    new google.maps.event.addListener(marker,"click",function(){
        hideAllFunc();
	xajax__ver_punto_generico_en_mapa(idLugar,tipo);

    });

    return marker;
}

/**
 * Agrega un lugar generico al arreglo general
 */
function addPointToArray(lat, lng, idLugar, nombre, icono, tipo)
{
    lugares[tipo].push(createGenericPoint(lat,lng,idLugar, nombre, icono,tipo));
}
/**
 * Agrega un lugar generico al arreglo general
 */
function addPointToArrayFicha(lat, lng, idLugar, nombre, icono, tipo)
{

    if(lugares[tipo]==null)
    {
        lugares[tipo] = new Array();
        lugares[tipo]["shown"] = true;
    }

    lugares[tipo].push(createGenericPoint(lat,lng,idLugar, nombre, icono,tipo));

}
/**
 * Muestra todos los puntos genericos
 */
function displayPoints(tipo)
{

    for(i=0; i<lugares[tipo].length;i++)
    {
        lugares[tipo][i].setMap(map);
    }
    hideMapLoader();

}

/**
 * Muestra los puntos genericos especificados
 */
function displayAllPoints()
{
    
    for(key in lugares)
    {
        for(i=0; i<lugares[key].length;i++)
        {
            if(lugares[key]["shown"] == true)
            {
                lugares[key][i].setMap(map);
            }
        }
    }
    hideMapLoader();
}

/**
 * Saca todos los puntos genericos
 */
function removeAllPoints()
{
   //dump(lugares);
   for(key in lugares)
   {
        for(i=0; i<lugares[key].length;i++)
        {
            lugares[key][i].setMap(null);
            //map.removeOverlay(lugares[key][i]);
        }
   }
}

/**
 * Saca los puntos genericos especificados
 */
function removePoints(tipo)
{
   //dump(lugares);
    for(i=0; i<lugares[tipo].length;i++)
    {
        lugares[tipo][i].setMap(null);
        //map.removeOverlay(lugares[tipo][i]);
    }
}

/**
 * Obtiene los puntos genericos mediante ajax
 */
function showGeneric(tipo, especifico)
{
    especifico = especifico || null;

    if(especifico!=null)
        tipo = tipo+"_"+especifico;

    if(lugares[tipo]==null)
    {
        lugares[tipo] = new Array();
        lugares[tipo]["shown"] = true;
        showMapLoader();
        xajax__traer_lugares_genericos(tipo,especifico);
    }
    else
    {
        //console.log("el tipo de lugar no es nulo y el mostrar está en "+lugares[tipo]["shown"]);
        if(lugares[tipo]["shown"] == true)
        {
            removePoints(tipo);
            lugares[tipo]["shown"] = false;
        }
        else
        {
            displayPoints(tipo);
            lugares[tipo]["shown"] = true;
        }
        //lugares[tipo]=null;

    }

}

/**
 * Muestra la nube de los puntos mediante ajax
 */
function showAjaxCloud(lat,lng,txt)
{
    var latlng = new google.maps.LatLng(lat, lng);
    var infowindow = new google.maps.InfoWindow({
        content: txt,
        pixelOffset: new google.maps.Size(10,-25)
    });
    infowindow.setPosition(latlng);
    infowindow.open(map);

    //map.openInfoWindowHtml(latlng, txt,{pixelOffset: new GSize(10,-25)});
}

/**
 * Muestra las residenciales
 */
function showMapItems(type)
{
    firstTime = false;
    $("#big_map_loader").slideDown();
    //Si la peticion proviene de los filtros se reposiciona
    if(type!=null)
    {
        removeProps();
        reposicionar = true;
    }

    showMapLoader();
    
    if(map.getBounds() !== undefined)
    {
        var SWlat = map.getBounds().getSouthWest().lat();
        var SWlng = map.getBounds().getSouthWest().lng();
        var NWlat = map.getBounds().getNorthEast().lat();
        var NWlng = map.getBounds().getNorthEast().lng();


        xajax__filtrar_lugares_opcional(SWlat,NWlat,SWlng,NWlng,xajax.getFormValues("search"),map.getZoom(), reposicionar);

        
    }
    else
    {
        alert("Caution!");
        xajax__filtrar_lugares_opcional(0,0,0,0,xajax.getFormValues("search"),map.getZoom(), reposicionar);
    }

}

function showMapLoader()
{
    $("#loadContentMapId").show();
    $("#big_map_loader").slideDown();
}

function hideMapLoader()
{
    $("#loadContentMapId").hide();
    $("#big_map_loader").slideUp();
}

function show_big_map_loader()
{
    $("#big_map_loader").slideDown();
}

function hide_big_map_loader()
{
    $("#big_map_loader").slideUp();
}
/**
 * Carga un mapa en el div especificado
 */
function load(map_div, preload)
{

    var myOptions = {
      zoom: initZoom,
      center: new google.maps.LatLng(initLat,initLng),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}

    }


    map = new google.maps.Map(document.getElementById(map_div), myOptions);
    //map.setCenter(new google.maps.LatLng(initLat,initLng), 10);
    //new google.Glog.write();
    new google.maps.event.addListener(map, 'dragend',function() {
        reposicionar = false;
        if(firstTime===true)
            showMapItems();
    });
    new google.maps.event.addListener(map, 'zoom_changed',function() {
        reposicionar = false;
        if(firstTime===true)
            showMapItems();
    });

    //map.setUIToDefault();

    geocoder = new google.maps.Geocoder();
    geocoder.region = "CL";

}

/**
 * Carga un mapa en el div especificado
 */
function loadSimpleMap(map_div, lat, lng, zoom)
{

    var myOptions = {
      zoom: zoom,
      center: new google.maps.LatLng(lat,lng),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}

    }
    map = new google.maps.Map(document.getElementById(map_div), myOptions);
    geocoder = new google.maps.Geocoder();
    geocoder.region = "CL";

}

function buscar_direccion(address, function_callback)
{
    if (geocoder) {
        geocoder.geocode( { 'address': address}, function_callback);
    }
}
/**
 * Se cierra el mapa grande (general)
 */
function _finishBigMap()
{
    isBigMapOpen = false;
    firstTime = true;
    $('#generalMap').remove();
    $('#controlBar').remove();
    $('#ContentBar').remove();
    $('#big_map_loader').remove();
    $('#selectionAbstract').remove();
    $('#mapContainer').remove();
    $('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
    // Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
    $('embed, object, select').css({ 'visibility' : 'visible' });
    //showMapItems();
    glowSwitch();
}

function updateInfoBox()
{

    var comunas = $("#comunas option:selected").text();
    var tipo = $("input[name='tipoA']:checked").parent().parent().children().html();
    var tipoPres= $("input[name='tipoPres']:checked").parent().parent().children().html();
    //dump(tipo);

    if(comunas===null || comunas==="")
        comunas = "Cualquiera";
    if(tipo===null || tipo==="")
        tipo = "Cualquiera";
    if(tipoPres===null || tipoPres==="")
        tipoPres = "Cualquiera";

    $("#comunaLayerSelTxt").html(comunas);
    $("#tipoASelTxt").html(tipo);
    $("#tipoPresSelTxt").html(tipoPres);
    $("#amountLowInputSelTxt").html(FormatNumberBy3($("#amountLowInput").val(),".","."));
    $("#amountHighInputSelTxt").html(FormatNumberBy3($("#amountHighInput").val(),".","."));
    $("#propQTY").html($("#placeQty").html());
    $('#loadContentMap').hide();
}

/**
 * Muestra el mapa general de Alooga
 */
function showBigMap()
{
    //Preparing interface
    var litCenterLat ;
    var litCenterLng;
    var litZoom;
    var solo_mapa_grande = false;
    
    if(map!==undefined)
    {
        litCenterLat = map.getCenter().lat();
        litCenterLng = map.getCenter().lng();
        litZoom = map.getZoom();
    }
    else
    {
        solo_mapa_grande = true;
        litCenterLat = initLat;
        litCenterLng = initLng;
        litZoom = initZoom;
    }
    isBigMapOpen = true;
    $("body").unbind("click");
    hideAllFunc();
    scroll(0,0);
    firstTime = true;


    $('body').append(htmlForMap);

    updateInfoBox();

    var spons = $('#mainSpons').find('img');
    for(i=0; i<spons.length; i++){
        idImg = spons[i].id;
        if(idImg!="sponsorIcon" && idImg!=""){
            var imgSrc = new String($("#"+idImg).attr("src"));

            $("#"+idImg+"_big").attr("src",imgSrc);
        }

    }

    $("#propQTY").html($("#placeQty").html());
    glowSwitch();
    var arrPageSizes = ___getPageSize();
    if(arrPageSizes[0]< 970)
        arrPageSizes[0]=970;

    $('#jquery-overlay').fadeIn();


    cssOptions = {
        top: 55,
        left: 145,
        width:				arrPageSizes[0]-300,
        height:				arrPageSizes[3]-100,
        'z-index': '101',
        position: 'absolute'
    };
    $('#generalMap').css(cssOptions);
    $('#generalMapRow').css({
        width:				arrPageSizes[0]-300,
        height:				arrPageSizes[3]-100,
        'z-index': '102'});

    cssOptions = {
        top: 43,
        left: 135,
        width:				arrPageSizes[0]-280,
        height:				arrPageSizes[3]-80,
        'z-index': '100',
        position: 'absolute'
    };
    $('#mapContainer').css(cssOptions);

    $('#controlBar').css({
        left: 155,
        top: 0,
        left: arrPageSizes[0]/2-435,
        //opacity:			'1',
        'z-index': '102',
        position: 'absolute'
    }).show();

    load('generalMap',litZoom, false);
    cssOptions = {
        'z-index': '101'
    };
    $('#generalMap').css(cssOptions);
    $('#closeMap').click(function() {
        litCenterLat = map.getCenter().lat();
        litCenterLng = map.getCenter().lng();
        litZoom = map.getZoom();
        _finishBigMap();
        if(solo_mapa_grande===false)
        {
            load('map', litZoom,false);
            map.setCenter(new google.maps.LatLng(litCenterLat,litCenterLng,litZoom));
            displayProp();
            displayAllPoints();
        }
    });

    $(window).resize(function() {
        // Get page sizes
        var arrPageSizes = ___getPageSize();
        if(arrPageSizes[0]< 970) arrPageSizes[0]=970;
        // Style overlay and show it
        $('#jquery-overlay').css({
                width:		'100%',
                height:		arrPageSizes[1]
        });

        $('#controlBar').css({
                top: 0,
                left: arrPageSizes[0]/2-435
        });

        cssOptions = {
            top: 55,
            left: 145,
            width:				arrPageSizes[0]-300,
            height:				arrPageSizes[3]-100,
            'z-index': '101',
            position: 'absolute'
        };
        $('#generalMap').css(cssOptions);
        $('#generalMapRow').css({
                width:				arrPageSizes[0]-300,
                height:				arrPageSizes[3]-100,
                'z-index': '101'});
        cssOptions = {
                top: 43,
                left: 135,
                width:				arrPageSizes[0]-280,
                height:				arrPageSizes[3]-80,
                'z-index': '100',
                position: 'absolute'
        };
        $('#mapContainer').css(cssOptions);
    });
    map.setCenter(new google.maps.LatLng(litCenterLat,litCenterLng,litZoom));
    showMapItems();
    displayAllPoints();

}


function dibujar_circulo(lat, lng, radius, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity)
{
    var d2r = Math.PI/180;
    var r2d = 180/Math.PI;
    var Clat = radius / 111132;  // Convert statute miles into degrees latitude
    var Clng = Clat/Math.cos(lat*d2r);
    var Cpoints = [];
    for (var i=0; i < 33; i++) {
        var theta = Math.PI * (i/16);
        Cy = lat + (Clat * Math.sin(theta));
        Cx = lng + (Clng * Math.cos(theta));
        var P = new google.maps.LatLng(Cy, Cx);
        Cpoints.push(P);
    }

    circulo = new google.maps.Polygon({
      paths: Cpoints,
      strokeColor: strokeColor,
      strokeOpacity: strokeOpacity,
      strokeWidth: strokeWidth,
      strokeWeight: 3,
      fillColor: fillColor,
      fillOpacity: fillOpacity
    });


    circulo.setMap(map);
    //var polygon_res = new GPolygon(Cpoints, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity);
    //return polygon_res;
 }
