//  ---------------------------------------------------------------------------
//  Управление картами на сайте
//  Дата ревизии: 15.06.2009
//  ООО "Реарт" (c) 2009
//  ---------------------------------------------------------------------------

var geocoder = null;
var map = null;
var marker = null;
var mgr = null;

// координаты по умолчанию - Золотые Ворота :)
var default_y = "56.12686124934864";
var default_x = "40.397114753723145";
var prefix = '';
var icons = {};
var markers = new Object();
markers.bankomat = new Object();
markers.bankoffice = new Object();
markers.terminal = new Object();
// Эта матрица используется для обхода последствий метода mgr.refresh() который отображает все скрытые маркеры
var markers_state = new Object();
markers_state.bankomat = new Object();
markers_state.bankoffice = new Object();
markers_state.terminal = new Object();
var catch_details = 0; 
var default_controller = 'bank';
var iam_marker = null;

function gotoObject(obj) {
    var targetOffset = $(obj).offset().top;
    $('html,body').animate({scrollTop: targetOffset}, 1000);
}

function loadObjectInfo(ctrl, type, id, not_go) {
    if (type && id) {
        $('#infow_' + id).after('<div id="ei_loaded" style="height:20px;float:left;"><img src="/wings/images/ajax-loader-small.gif" style="margin-left:10px;"></div>');
        $('#info_area').html('<div style="text-align:center;"><p>отправка запроса...</p><img src="/wings/images/ajax-loader.gif" style="margin-top:10px;"></div>');
        $.get(global_action, { 'ctrl': ctrl, 'action': 'show_child', 'type' : type, 'id': id }, function(data) {
            $('#info_area').html('<div>' + data + '</div>');
            $('#ei_loaded').remove();
            
            map.setZoom(16);

            $('#go_top').click(function(){
                gotoObject('#top_anchor');
            });
            
            if (!not_go) {
                gotoObject('#info_anchor');
            }
        });
    }
}

function generateInfoText(obj) {
    var text = '';
    
    if (obj != null) {
        if (obj.type == 'bankoffice') {
            text = '<div><b>Офис банка "' + obj.owner_title + '"</b><br><nobr>' + obj.title +
                   '</nobr><br><nobr>Адрес: ' + obj.adr + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr>';
        }
        else {
            if (obj.type == 'bankomat') {
                text = '<div><b>Банкомат банка "' + obj.owner_title + '"</b><br>';
                if (obj.title != obj.adr) {
                    text = text + '<nobr>Расположен: ' + obj.title + '</nobr><br>';
                }
                text = text + '<nobr>Адрес: ' + obj.adr + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr>';
            }
            else {
                if (obj.type == 'terminal') {
                    text = '<div><b>Терминал "' + obj.owner_title + '"</b><br>';
                    if (obj.title != obj.adr) {
                        text = text + '<nobr>Расположен: ' + obj.title + '</nobr><br>';
                    }
                    text = text + '<nobr>Адрес: ' + obj.adr + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr>';
                }
            }
        }
        
        if (catch_details) {
            text = text + '<br><div id="infow_'+obj.id+'" style="height:20px;float:left;">';
            text = text + '<a href="javascript: loadObjectInfo(\''+default_controller+'\', \''+obj.type+'\','+obj.id+', 0);">подробнее</a>';
            text = text + '</div>';
        }
        else {
            text = text + '<br><a id="infow_'+obj.id+'" class="det_ref" href="?type='+obj.type+'&id='+obj.id+'">подробнее</a>';
        }
        
        text = text + '</div>';
    }
    
    return text;
}

function getIcon(object_type) { 
    if (!icons[object_type]) { 
        var icon = new GIcon(); 
        icon.image = icons_img[object_type]; 
        icon.iconAnchor = new GPoint(16, 49); 
        icon.infoWindowAnchor = new GPoint(16, 10); 
        icon.iconSize = new GSize(32, 50); 
        icons[object_type] = icon; 
      } 

    return icons[object_type];  
} 

initMap = function() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_area"));
        map.addControl(new GSmallMapControl());
        map.setCenter(new GLatLng(default_y, default_x), 13, G_NORMAL_MAP);
//        map.setCenter(new GLatLng(default_y, default_x), 13, G_HYBRID_MAP);
        GEvent.addListener(map, "addoverlay", function(overlay) { 
            refreshMarkers();
        });  
    }
}

function addObjectOnMap(obj, obj_type) { 
    var batch = []; 
    if ( obj != null ) {
        if (parseInt(obj.on_map)) {
            var marker = new GMarker( new GLatLng(obj.lat, obj.lng), { icon: getIcon(obj_type) } );

            if (markers[obj_type][obj.owner_id] == null) {
                markers[obj_type][obj.owner_id] = new Array();
                markers_state[obj_type][obj.owner_id] = new Array();
            }

            markers[obj_type][obj.owner_id][obj.id] = marker;
            markers_state[obj_type][obj.owner_id][obj.id] = 1;
            GEvent.addListener(marker, "click", function() { 
                marker.openInfoWindowHtml(generateInfoText(obj));
                if (catch_details) {
                    $('#btn_' + obj.type).click();
                    $('.active_li').removeClass('selected');
                    $('#' + obj.type + '_list .active_li').each(function(){
                        if ($(this).attr('core:id') == obj.id) {
                            $(this).addClass('selected');
                        }
                    });
                    $('#info_area').html('');
                }
            }); 
            batch.push(marker);
        }
    }
    return batch;
}

// Функция принудительно прячет маркеры после кривой реализации mgr.refresh()

refreshMarkers = function() {
    for (var k in markers_state) {
        for (var i in markers_state[k]) {
            for (var j in markers_state[k][i]) {
                if (!markers_state[k][i][j]) {
                    markers[k][i][j].hide();
                }
            }
        }
    }
}

loadObjects = function(list, c_type) {
    if (!mgr) {
        mgr = new GMarkerManager(map);
    }
    if (list != null) {
        for (var item in list) {
            mgr.addMarkers(addObjectOnMap(list[item], c_type), 10);
        }
    }
    mgr.refresh();
    refreshMarkers();
}

loadOwners = function(dsc) {
    if (dsc != null) {
        for (var obj in dsc.root.list) {
            if (dsc.root.list[obj] != null ) {
                for (var cls in dsc.root.list[obj].list) {
                    loadObjects(dsc.root.list[obj].list[cls].list, dsc.root.list[obj].list[cls].tag);
                }
            }

            for (var type in markers) {
                if (markers[type][obj] == null) {
                    markers[type][obj] = new Object();
                    markers_state[type][obj] = new Object();
                }
            }

        }
    }
}

showCollection = function(id, c_type) {
    if (id) {
        if (markers[c_type][id] != null) {
            // Отображаем уже загруженные маркеры
            for (var obj in markers[c_type][id]) {
                markers[c_type][id][obj].show();
                markers_state[c_type][id][obj] = 1;
            }
        }
        else {
            // Загружаем коллекцию объектов
            if (global_action != null) {
                $('#ajax_msg').html('<p>отправка запроса...</p><img src="/wings/images/ajax-loader.gif" style="margin-top:10px;">');
                $.get(global_action, { 'ctrl': 'bank', 'action': 'json_'+c_type+'_list', 'id': id }, function(data) {
                    var json_obj = eval( '(' + data + ')' );
                    loadObjects(json_obj, c_type);
                    $('#ajax_msg').html('');
                });
            }
        }
    }
}

hideCollection = function(id, c_type) {
    if (id) {
        if (markers[c_type][id] != null) {
            for (var obj in markers[c_type][id]) {
                markers[c_type][id][obj].closeInfoWindow();
                markers[c_type][id][obj].hide();
                markers_state[c_type][id][obj] = 0;
            }
        }
    }
}

locateObjectOnMap = function(c_type, owner_id, obj_id, dsc) {
    if (c_type && owner_id && obj_id) {
        if (markers[c_type][owner_id][obj_id] != null) {
            if (markers_state[c_type][owner_id][obj_id]) {
                var mymarker = markers[c_type][owner_id][obj_id];
                var iwAnchor = mymarker.getIcon().infoWindowAnchor; 
                var iconAnchor = mymarker.getIcon().iconAnchor; 
                var offset = new GSize(iwAnchor.x-iconAnchor.x, iwAnchor.y-iconAnchor.y); 
                map.openInfoWindowHtml(mymarker.getLatLng(), generateInfoText(dsc.root.list[owner_id].list[c_type].list[obj_id]), {pixelOffset:offset}); 
            }
        }
    }
}

/* Блок клиентских функций позиционирования */

function callbackAddressToMap(response) {
    var point = new GLatLng(default_y, default_x);
    var message = '';
    
    if (!response || response.Status.code != 200) {
        // Гугл не знает такого адреса
        message = 'Адрес не найден :(';
    } 
    else {
        var place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
        message = 'Тут!?';
    }

    if (iam_marker != null) {
        iam_marker.closeInfoWindow();
        map.removeOverlay(iam_marker);
    }

    iam_marker = new GMarker(point, {draggable: true});
    GEvent.addListener(iam_marker, "dragend", function() {
        map.panTo(iam_marker.getLatLng());
    });
    map.addOverlay(iam_marker);
    iam_marker.openInfoWindowHtml(message);
    map.setZoom(16);
    map.panTo(point);
}

function geoLocateAddressOnMap(address) {
    if (geocoder == null) {
        geocoder = new GClientGeocoder();
    }

    geocoder.getLocations('г. Владимир, ' + address, callbackAddressToMap);
}

