var gmapLayerVisibility = {
    city: 1,
    place: 1,
    sight: 1,
    hotel: 1
}

var gmapCurrentLayer = 'place';

var gmapRegions = [{
        title:  'Þæíûé áàéêàë',
        color: '#ff5050',
        points: [[51.8968,103.9306],[51.4540,105.8862],[50.9030,105.8422],[51.1380,102.7441],[51.8018,102.7441],[51.8968,103.9306]]
}];

function gmapShowLayer(type) {
    switch (type) {
        case 'place':
            gmapHideLayer('sight');
            gmapHideLayer('hotel');
            break;
        case 'sight':
            gmapHideLayer('place');
            gmapHideLayer('hotel');
            break;
        case 'hotel':
            gmapHideLayer('place');
            gmapHideLayer('sight');
            break;
    }

    gmapLayerVisibility[type] = 1;
    gmapCurrentLayer = type;
    for(var i=0; i< baikal_markers[type].length;i++) {
        baikal_markers[type][i].show();
    }
    if ($("ul.place-list li.map-"+type) != undefined) {
        $("ul.place-list li.map-"+type).show();
    }
    $("td.title-map a.map-"+type).removeClass('disabled');
}

function gmapHideLayer(type) {
    gmapLayerVisibility[type] = 0;
    for(var i=0; i< baikal_markers[type].length;i++) {
        baikal_markers[type][i].hide();
    }
    if ($("ul.place-list li.map-"+type) != undefined) {
        $("ul.place-list li.map-"+type).hide();
    }
    $("td.title-map a.map-"+type).addClass('disabled');
}

function gmapInitialize() {
    baikal_map = new google.maps.Map2(document.getElementById("baikal_map"));
    //baikal_map.disableDragging();
    baikal_map.enableScrollWheelZoom();
    baikal_map.addControl(new GLargeMapControl3D());
    //baikal_map.addControl(new GOverviewMapControl());
    baikal_map.addControl(new GMapTypeControl());
    baikal_map.setMapType(G_SATELLITE_MAP);
    //baikal_map.setMapType(G_HYBRID_MAP);



    var mapTypes=baikal_map.getMapTypes();
    for(var i=0;i<mapTypes.length;i++){
        mapTypes[i].getMinimumResolution=function(){return 6;}
        mapTypes[i].getMaximumResolution=function(){return 14;}
    }

    baikal_map.centerLat   = gmapCenterLat || 53.7;
    baikal_map.centerLng   = gmapCenterLng || 105;
    var zoom        = gmapZoom || 6;

    baikal_map.setCenter(new google.maps.LatLng(baikal_map.centerLat, baikal_map.centerLng), zoom);
    baikal_map.sw = baikal_map

    GEvent.addListener(baikal_map,"move", function(){
        var bounds = new GLatLngBounds(new GLatLng(51, 101),new GLatLng(56, 113));
        //var bounds = new GLatLngBounds(new GLatLng(baikal_map.centerLat, baikal_map.centerLng),new GLatLng(baikal_map.centerLat, baikal_map.centerLng));

        var C = baikal_map.getCenter();
        if(bounds.contains(C)){return;}
        var Y=C.lat();
        var X=C.lng();
        var sw=bounds.getSouthWest();
        var ne=bounds.getNorthEast();
        if(X<sw.lng()){X=sw.lng();}
        if(X>ne.lng()){X=ne.lng();}
        if(Y<sw.lat()){Y=sw.lat();}
        if(Y>ne.lat()){Y=ne.lat();}
        baikal_map.setCenter(new GLatLng(Y,X));
    });


    baikal_markers = {
        city:  [],
        place: [],
        sight: [],
        hotel: []
    };

    gmap_manager = new MarkerManager(baikal_map);

    if (typeof gmapLayersCallback == 'function') {
        gmapLayersCallback(baikal_map, gmap_manager);
    }

    if (typeof gmapMarkersCallback == 'function') {
        gmapMarkersCallback(baikal_map, gmap_manager);
    }


    //ìåñòíîñòè
    /*for (var i=0;i<gmapRegions.length;i++) {
        var reg = gmapRegions[i];
        var points = [];
        for (var j=0; j<reg.points.length;j++){
            var point = reg.points[j];
            points.push(new GLatLng(point[0],point[1]));
        }
        var polygon = new GPolygon(points, reg.color, 1, 1, reg.color, 0.1);
        baikal_map.addOverlay(polygon);
    }*/
}
google.setOnLoadCallback(gmapInitialize);


function addMarker(pointData) {
    var latlng = new GLatLng(pointData.latitude, pointData.longitude);

    //alert('addMarker');

    if (pointData.zoom == 0) return;

    var icon = new GIcon();
    icon.iconSize = new GSize(200, 22);
    var labelOffset;
    var textAlign = 'left';

    switch (pointData.position) {
        case 'left-top':
            icon.iconAnchor = new GPoint(195, 17);
            labelOffset = new GSize(-185, -20);
            textAlign = 'right';
            break;
        case 'left-bottom':
            icon.iconAnchor = new GPoint(195, 5);
            labelOffset = new GSize(-185, 0);
            textAlign = 'right';
            break;
        case 'right-top':
            icon.iconAnchor = new GPoint(5, 17);
            labelOffset = new GSize(0, -20);
            break;
        case 'right-bottom':
            icon.iconAnchor = new GPoint(5, 5);
            labelOffset = new GSize(0, 0);
            break;
        default:
            icon.iconSize = new GSize(10, 10);
            icon.iconAnchor = new GPoint(5, 5);
            pointData.position = 'none';
            break;
    }

    var color = 'gray';
    switch (pointData.type) {
        case 'place':
            color = 'green';
            break;
        case 'sight':
            color = 'blue';
            break;
        case 'hotel':
            color = 'yellow';
            break;
    }



    var marker;

    if (pointData.position == 'none') {
        icon.image = 'images/gmap/' + color + '-marker.png';
        var opts = {
            icon: icon,
            title: pointData.text
        };
        marker = new GMarker(latlng, opts);

    } else {
        icon.image = 'images/gmap/' + color + '-' + pointData.position + '-' + 'marker.png';
        var cls = "map-marker-label";
        if (pointData.type == 'city') {
            cls += ' map-marker-label-city';
        }
        var opts = {
            icon: icon,
            "labelText": '<div class="' + cls + '" style="text-align:'+textAlign+'"><a href="' + pointData.link + '">' + pointData.text + '</a></div>',
            "labelOffset": labelOffset
        };
        marker = new LabeledMarker(latlng, opts);
    }


    if (gmapLayerVisibility[pointData.type]==0) {
        marker.hide();
    }

    var minZoom = pointData.zoom || 7;
    baikal_markers[pointData.type].push(marker);
    gmap_manager.addMarker(marker,minZoom);
    return marker;
}


function gmapToggleLayer(type) {
    if (gmapLayerVisibility[type] == 0) {
        gmapShowLayer(type);
    } else {
        gmapHideLayer(type);
    }
}


