var isloadmap;
var map=null;
var mgr=null;
var point;
var zoom;
var gmgr;
var pointStart = null;
var pointEnd = null;
var isClick = false;
var polyShape;
// флаг показа окна - чтобы не подгружать щиты, елси карта сдвинулась окном
var isWindowOpen = false;
// флаг подгруза щитов после закрытия окна
var doLoadOnClose = false;
var polyLineColor = "#3355ff";
var polyFillColor = "#335599";
var polyPoints = new Array();
var markers = new Array();
var sideMarker = new Array();
var sideMarkerIcon  = new Array();
var sideMarkerInfo = new Array();
var m = new Array();
var g = new Array();
var loadIcon;
var loadMarker;
var ajax_params = new Object;
var isClickGroup = false;
var tp = 'bb';

/* Google/Yandex */
function getGMap(idElement, cLat, cLng, mZoom) {
    var mapz=null;
    
    var mapNode, t, defCLat = 55.751849391735284, defCLng = 37.618560791015625, defmZoom = 10;
    if (null == mapz && (mapNode != document.getElementById(idElement))) {
        // Create map.
        mapz = new GMap2(document.getElementById(idElement));

        mapz.addControl(new GLargeMapControl());
        mapz.addControl(new GHierarchicalMapTypeControl());
        mapz.addControl(new GScaleControl());
        mapz.disableGoogleBar();
        mapz.disableScrollWheelZoom();
        mapz.enableContinuousZoom();

        for (var i=0; i<G_DEFAULT_MAP_TYPES.length; i++) mapz.removeMapType(G_DEFAULT_MAP_TYPES[i]);
        mapz.addMapType(G_NORMAL_MAP);
        mapz.removeMapType(G_HYBRID_MAP);
        //map.setMapType(G_NORMAL_MAP);

        // Centered map.
        cLat = (isNaN(parseFloat(cLat)) ? defCLat : parseFloat(cLat));
        cLng = (isNaN(parseFloat(cLng)) ? defCLng : parseFloat(cLng));
        mZoom = (isNaN(parseInt(mZoom)) ? defmZoom : parseInt(mZoom));
        mapz.setCenter(new GLatLng(cLat, cLng), mZoom);

        // Set options.
        mapz.enableDragging();
        mapz.clearOverlays();
    }
    return mapz;
}

function getGYMap(idElement, cLat, cLng, mZoom) {
    var xmap = getGMap(idElement, cLat, cLng, mZoom);
    if (null != xmap) {
        addGLayer(xmap);
        addYLayer(xmap);
        var lmt = xmap.getMapTypes();
        for(var ix in lmt) {
            if ('Yandex' == lmt[ix].getName()) {
                (function(xmap, type) { setTimeout(function(){ xmap.setMapType(type); }, 300); })(xmap, lmt[ix]);
            }
        }
        xmap.addMapType(G_SATELLITE_MAP);
    }
    return xmap;  
}

/*
function getYGMap(idElement, cLat, cLng, mZoom)
{
  map = getGYMap(idElement, cLat, cLng, mZoom);
  if (null != map) {
    var lmt = map.getMapTypes();
    for(var ix in lmt) {
      if ('Yandex' == lmt[ix].getName()) {
        (function(map, type) { setInterval(function(){ map.setMapType(type); }, 300); })(map, lmt[ix]);
      }
    }
  }
  return map;
}
*/

function atanh(x) { return 0.5*Math.log((1+x)/(1-x)); }

function CustomfromLatLngToPixel(lotlan,zoom)
{
    var PixelsAtZoom = 256*Math.pow(2,zoom);
    var exct = 0.0818197;
    var z = Math.sin(lotlan.latRadians());
    var c = (PixelsAtZoom/(2*Math.PI));
    var x = Math.floor(PixelsAtZoom/2+lotlan.lng()*(PixelsAtZoom/360));
    var y = Math.floor(PixelsAtZoom/2-c*(atanh(z)-exct*atanh(exct*z)));
    return new GPoint(x,y);
}

function CustomfromPixelToLatLng(pixel, zoom)
{
    var PixelsAtZoom = 256*Math.pow(2,zoom);
    var Lon = ((pixel.x)-PixelsAtZoom/2)/(PixelsAtZoom/360);
    var Lat = ((pixel.y)-PixelsAtZoom/2)/-(PixelsAtZoom/(2*Math.PI));
    Lat = Math.abs((2*Math.atan(Math.exp(Lat))-Math.PI/2)*180/Math.PI);

    var Zu = Lat/(180/Math.PI);
    var Zum1 = Zu+1;
    var exct = 0.0818197;
    var yy = -Math.abs(((pixel.y)-PixelsAtZoom/2));
    while (Math.abs(Zum1-Zu)>0.0000001)
    {
        Zum1 = Zu;
        Zu = Math.asin(1-((1+Math.sin(Zum1))*Math.pow(1-exct*Math.sin(Zum1),exct))
            /(Math.exp((2*yy)/-(PixelsAtZoom/(2*Math.PI)))*Math.pow(1+exct*Math.sin(Zum1),exct)));
    }

    if (pixel.y>PixelsAtZoom/2) {Lat=-Zu*180/Math.PI} else {Lat=Zu*180/Math.PI}
    return new GLatLng(Lat,Lon,false);
}

function CustomGetTileUrl(a,b) {
  var url = "http://vec0"+((a.x+a.y)%5)+".maps.yandex.net/tiles?l=map&v=2.16.0&x=" + a.x + "&y=" + a.y + "&z=" + b + '&g=Gag';
  return url;
}

function addGLayer(map)
{
    var GMapTypeOptions = { minResolution: 0, maxResolution: (G_NORMAL_MAP.getMaximumResolution() - 1) };
    var custommap = new GMapType(G_NORMAL_MAP.getTileLayers(), G_NORMAL_MAP.getProjection(), "Google", GMapTypeOptions);
    map.addMapType(custommap);
    map.setCenter(map.getCenter(), map.getZoom(), custommap);
    map.removeMapType(G_NORMAL_MAP);
}

function addYLayer(map)
{
    var layers = [new GTileLayer(null, 0, (G_NORMAL_MAP.getMaximumResolution() - 1))];
    layers[0].getTileUrl = CustomGetTileUrl;

    var customProjection = new GMercatorProjection((G_NORMAL_MAP.getMaximumResolution() - 1));
    customProjection.fromLatLngToPixel=CustomfromLatLngToPixel;
    customProjection.fromPixelToLatLng=CustomfromPixelToLatLng;

    var GMapTypeOptions = { minResolution: 0, maxResolution: (G_NORMAL_MAP.getMaximumResolution() - 1) };
    var custommap = new GMapType(layers, customProjection, "Yandex", GMapTypeOptions);
    custommap.getTextColor = function() {return "#000000";};
    map.addMapType(custommap);
    map.setCenter(map.getCenter(), map.getZoom(), custommap);
}

function loadBoardInfo(){
    var marker = this;
    var c = marker.getPoint();
    window.isWindowOpen = true;
    $.post((tp=='bb'?"/ajax/map.php":"/ajax/map-pt.php"),{x:c.lat(),y:c.lng()},function(data) {
        replaceContent(data,marker);
    },"json");
}

function loadBoardInfoPt(){
    var marker = this;
    var c = marker.getPoint();
    window.isWindowOpen = true;
    $.post(("/ajax/map-pt.php"),{x:c.lat(),y:c.lng()},function(data){
        replaceContent(data,marker);
    },"json");
}

function replaceContent(data,marker){
    marker.openInfoWindowHtml(data.html,{maxWidth: '250'});
    PCL_TooltipUpdate();
} 

function getHrefParams(href) {
    if ( undefined == href ) href = window.location.href;
    if ( -1 == href.indexOf("?")) return {};
    var sq = href.substr(href.indexOf("?") + 1);
    var x = sq.replace(/;/g, '&').split('&'), i, name, t;
    for (q={}, i=0; i < x.length; i++) {
        t = x[i].split('=', 2);
        name = unescape(t[0]);
       if ( t[1] ) {
            if (! q[name]) q[name] = [];
            if (t.length > 1) q[name][q[name].length] = unescape(encodeURIComponent(t[1]));
            else q[name][q[name].length] = true;
        }
    }
    point = map.getCenter();
    q['lat']=point.lat();
    q['lng']=point.lng();
    
    var bounds = map.getBounds();
    //console.log(bounds);
    //alert(bounds);
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
        
    q['ymin']=southWest.lng();
    q['ymax']=northEast.lng();
    q['xmin']=southWest.lat();
    q['xmax']=northEast.lat();
    
    return q;
}

function loadBillboards(c, type, dnc){
    if ( typeof(type) == 'undefined') { type = 'bb'; }
    if ( typeof(dnc) == 'undefined') { dnc = false; }
    tp = type;
    if(window.isWindowOpen==true) { doLoadOnClose = true; return true; }
    doLoadOnClose = false;
    
    /*
    loadIcon = new GIcon();
    loadIcon.image = "/ru/images/public/map-loader2.gif";
    loadIcon.iconSize = new  GSize(200, 66);
    loadIcon.dragCrossSize = new  GSize(0, 0);
    loadIcon.shadowSize = new  GSize(12, 12);
    loadIcon.iconAnchor = new  GPoint(100, 33);
    loadIcon.infoWindowAnchor= new  GPoint(6, 6);
    lmarkerOptions = { icon:loadIcon };
    */

    if (!dnc) {
        if(mgr != null) mgr.clearMarkers();
    }    

    if ( map.getZoom() > 12 ) {
        var params = getHrefParams();
        var tmp=document.getElementById('also_transparent');
        if (tmp && tmp.checked) {
            params['peret']=1;
        }    
        
        //var pt = map.getCenter();
        //loadMarker = new GMarker(pt, lmarkerOptions);
        //map.addOverlay(loadMarker);
        
        $('#preloader').show();
        
        $.post(( type=='bb' ? "/ajax/billboards.php" : "/ajax/peret.php" ), params,
            function(data) {
                addMarkers(data);
                //map.removeOverlay(loadMarker);
                setTimeout('$(\'#preloader\').hide();',10000);
            },
        "json");
    }
}

function showCoords(c){
    //map.setCenter(bounds.getCenter());
    //map.setZoom(map.getBoundsZoomLevel(bounds));
    isClickGroup=true;
    map.setCenter(c,13);
}

function loadMapSearch() {
    if(map == null && isloadmap){
    $("div.map-loaded").show();
        var script = document.createElement("script");
        script.src = "http://www.google.com/jsapi?key=ABQIAAAA7Rn9taVn4nr2mfVUxLpD4hQ3ShrPD4Oen9NYtPwV6-W5vLbi1RTW20z_n0DvV1JIVMGKR6wfSndyCw&callback=loadMaps";
        script.type = "text/javascript";
        document.getElementsByTagName("head")[0].appendChild(script);
    }
}   

function addIcon(icon) { // Add icon attributes
    icon.iconSize = new  GSize(11, 11);
    icon.dragCrossSize = new  GSize(0, 0);
    icon.shadowSize = new  GSize(11, 11);
    icon.iconAnchor = new  GPoint(5, 5);
} // function addIcon(icon)

function leftClick(overlay,point){
    if(overlay != null) return;
    //alert('click: '+point.lat()+' '+point.lng());
    if(point && markers.length<2) {
         $("#edit-clearpoly").removeAttr("disabled");
         $('#edit-clearpoly').removeClass('bt-hidden');
        var square = new  GIcon();
        square.image = "/ru/images/square.png";
        addIcon(square);
        var marker =new  GMarker(point, {icon:square, draggable:true, bouncy:false, dragCrossMove:true});
        markers.push(marker);
        map.addOverlay(marker);
        GEvent.addListener(marker, "drag", function() {drawPoly();});
    }else if(point && markers.length==2){
        clearPoly();
        leftClick(overlay,point);
    }
    if(markers.length == 2){
        drawPoly();
    }else{
        //clearPoly();
    }

} //-- function leftClick(overlay, point)

function clearPoly() {
    if(polyShape) map.removeOverlay(polyShape);
    polyPoints.length = 0;

    if(markers.length==2) {
        map.removeOverlay(markers[0]);
        map.removeOverlay(markers[1]);
        markers.pop();
        markers.pop();
        markers.length=0;
    }
    else if(markers.length==1) {
        map.removeOverlay(markers[0]);
        markers.pop();
        markers.length=0;
    }

    document.getElementById('edit-lat0').value = 0;
    document.getElementById('edit-lat1').value = 0;
    document.getElementById('edit-lat2').value = 0;
    document.getElementById('edit-lat3').value = 0;
    document.getElementById('edit-lng0').value = 0;
    document.getElementById('edit-lng1').value = 0;
    document.getElementById('edit-lng2').value = 0;
    document.getElementById('edit-lng3').value = 0;

    $("#edit-zoomreg").attr("disabled","disabled");
    $("#edit-clearpoly").attr("disabled","disabled");
    $("#edit-submit-map").attr("disabled","disabled");
    $(".subformbtn").attr("disabled","disabled");
    $("#edit-basket").attr("disabled","disabled");


    $('#edit-clearpoly').addClass('bt-hidden');
    $('#edit-zoomreg').addClass('bt-hidden');
    $('#edit-basket').addClass('bt-hidden');

    //  setMarkers();
}

function clearPolyAll() {
    clearPoly();
    map.clearOverlays();
    markers.length = 0;
}

function initPoly() {
    if( 0 != 0 ) {
        clearPolyAll();
        var pp0 = new  GLatLng(0,0);
        var pp1 = new  GLatLng(0,0);
        var square = new  GIcon();
        square.image = "/ru/images/square.png";
        addIcon(square);
        var marker0 =new  GMarker(pp0, {icon:square, draggable:true, bouncy:false, dragCrossMove:true});
        markers.push(marker0);
        map.addOverlay(marker0);
        var marker1 =new  GMarker(pp1, {icon:square, draggable:true, bouncy:false, dragCrossMove:true});
        markers.push(marker1);
        map.addOverlay(marker1);
        drawPoly();
        GEvent.addListener(marker0, "drag", function() {
            drawPoly();
        });
        GEvent.addListener(marker1, "drag", function() {
            drawPoly();
        });

    }
}

function drawPoly()
{
     if(polyShape) map.removeOverlay(polyShape);

     polyPoints.length = 0;
     var p1 = markers[0].getLatLng();
     var pp0 =  new  GLatLng(p1.lat(),p1.lng());

     if(markers.length==2){
         var p2 = markers[1].getLatLng();
         var pp1 =  new  GLatLng(p2.lat(),p1.lng());
         var pp2 =  new  GLatLng(p2.lat(),p2.lng());
         var pp3 =  new  GLatLng(p1.lat(),p2.lng());

         polyPoints.push(pp0);
         polyPoints.push(pp1);
         polyPoints.push(pp2);
         polyPoints.push(pp3);
         polyPoints.push(pp0);
         document.getElementById('edit-lat1').value = pp1.lat();
         document.getElementById('edit-lng1').value = pp1.lng();
         document.getElementById('edit-lat2').value = pp2.lat();
         document.getElementById('edit-lat0').value = pp0.lat();
         document.getElementById('edit-lat3').value = pp3.lat();
         document.getElementById('edit-lng0').value = pp0.lng();
         document.getElementById('edit-lng3').value = pp3.lng();
         document.getElementById('edit-lng2').value = pp2.lng();

         $("#edit-zoomreg").removeAttr("disabled");
         $("#edit-clearpoly").removeAttr("disabled");
         $("#edit-submit-map").removeAttr("disabled");
         $(".subformbtn").removeAttr("disabled");
         $("#edit-basket").removeAttr("disabled");
         $('#edit-clearpoly').removeClass('bt-hidden');
         $('#edit-zoomreg').removeClass('bt-hidden');
         $('#edit-basket').removeClass('bt-hidden');
         polyShape = new  GPolygon(polyPoints, polyLineColor, 1, .8, polyFillColor,.3);
         var bounds = polyShape.getBounds();
         map.addOverlay(polyShape);
     }
     else if (markers.length==1){
         $("#edit-clearpoly").removeAttr("disabled");
         $('#edit-clearpoly').removeClass('bt-hidden');
     }
} //--function drawPoly()

function zoomToPoly() {
    if(polyShape && polyPoints.length > 0) {
        var bounds = polyShape.getBounds();
        // x левого нижнего

        map.setCenter(bounds.getCenter());
        map.setZoom(map.getBoundsZoomLevel(bounds));
        zoom = map.getZoom();
        document.getElementById('edit-mapzoom').value = zoom;
        point = map.getCenter();
        document.getElementById('edit-lat').value = point.lat();
        document.getElementById('edit-lng').value = point.lng();
    }
}

function addIconMarker(icon) { // Add icon attributes
    icon.shadow ='';
    icon.iconAnchor = new  GPoint(20, 20);
    icon.iconSize = new  GSize(40, 40);
    icon.dragCrossSize = new  GSize(0, 0);
    icon.shadowSize = new  GSize(0, 0);
    icon.infoWindowAnchor= new  GPoint(8, 8);


} // function addIcon(icon)

function addIconMiniMarker(icon) { // Add icon attributes
    icon.iconSize = new  GSize(12, 12);
    icon.dragCrossSize = new  GSize(0, 0);
    icon.shadowSize = new  GSize(12, 12);
    icon.iconAnchor = new  GPoint(6, 6);
    icon.infoWindowAnchor= new  GPoint(6, 6);
} // function addIcon(icon)

/**
* Добавляет маркеры на карту.
*/
function addMarkers(data)
{
if ( ! data) return;
if (mgr == null && map != null) {
    mgr = new MarkerManager(map);
}

saved_m = data;
var mms = new Array();
var sa = document.getElementById('show_all')?document.getElementById('show_all').checked:true;

for(marker=0;data[marker];marker++)
{
    var m = data[marker];
    m.type = isNaN(parseInt(m.type)) ? 1 : parseInt(m.type);

    // Если не установлен чекбокс, то пропускать занятые щиты
    if (true || m.mtype==2 || sa || (sa && m.mtype==1))
    {
        var i = new GIcon();
        addIconMiniMarker(i);
        
        if (m.tx=='bb') {
            //console.log(m);
            if (m.mtype==3) {
                i.image = "/ru/images/xmarker"+m.mtype+".gif";
            }
            else {
                i.image = "/ru/images/xmarker"+m.mtype+".png";
            }
            var bb = m.bb;
            html = '<img src="/ru/images/public/ajax-load.gif" id="info_'+bb+'">';
            var gm = new GMarker(new GLatLng(m.x,m.y), {icon:i , draggable:false, bouncy:false, dragCrossMove:false});
            gm.bindInfoWindowHtml(html,{maxWidth: '300'});
            GEvent.addListener(gm,"click",loadBoardInfo);
        }
        else {
            i.image = "/ru/images/ymarker"+m.mtype+".png";
            var bb = m.bb;
            html = '<img src="/ru/images/public/ajax-load.gif" id="info_'+bb+'">';
            var gm = new GMarker(new GLatLng(m.x,m.y), {icon:i , draggable:false, bouncy:false, dragCrossMove:false});
            gm.bindInfoWindowHtml(html,{maxWidth: '300'});
            GEvent.addListener(gm,"click",loadBoardInfoPt);
        }
        
        mms.push(gm);
    }
}
mgr.addMarkers(mms, 1);
mgr.refresh();
}     

function ShowAllMarkers() {
    mgr.clearMarkers();
    addMarkers(saved_m);
}

