/**
 * Работа с картой
 * @uses jquery.url.js
 */
var map = {
    options: {
        minZoom: 4,
        maxZoom: 17,
        defaultZoom: 15,
        center: new GLatLng(55.708473, 37.587233),
        allowedBounds: new GLatLngBounds(
            new GLatLng(-180,0),
            new GLatLng(180, 90)
        ),
        maxMarkers: 100
    },
    defaultIcon: new GIcon(G_DEFAULT_ICON),   // дефолтный красный маркер
    baseIcon: new GIcon(G_DEFAULT_ICON),      // маркер, на основе которго генерятся остальные
	borderbounds: new GLatLngBounds(), // объект границы для автоматического зумирования
    atmIconCache: {},
    markers: {},
    activeMarkers: 0,
	useautozoom: 0,
	userefreshmarkers: 1, // не запускать повторный запрос на маркеры при открытии инфоокна, вызывающего автоматический сдвиг карты
    lastMarkerUpdate: '',
    search: '',
	stext: '',
    lines: [],
	iphone: false,
    geocoder: {}
}
if ($.browser.msie && $.browser.version == '6.0'){
    map.options.maxMarkers = 30;
}

/**
*   Плагин, делает DOM-объект контролом над картой
*   Позиционируется абсолютно (в CSS)
*   Для того, чтобы IW не открывались под контролами
**/
jQuery.fn.GMapFakeControl = function() {
    $.each(this, function() {
        div = $(this);
        function FakeControl() {}
        FakeControl.prototype = new GControl();

        FakeControl.prototype.initialize = function(map) {
            div.clone().appendTo(map.getContainer()).remove();
            return div[0];
        }
        FakeControl.prototype.getDefaultPosition = function() {
            return new GControlPosition(G_ANCHOR_TOP_LEFT);
        }
        map.addControl(new FakeControl());
    });
}

/**
* Ограничиваем максимальный и минимальный зум
* @param    int     minZoom        Минимальный зум (1-17)
* @param    int     minZoom        Максимальный зум (1-17)
*/
map.limitZoom = function(minZoom, maxZoom) {
    minZoom = minZoom || this.options.minZoom;
    maxZoom = maxZoom || this.options.maxZoom;

    // Массив типов карт (ландшафт, спутник, и т.д.)
    var mapTypes = this.getMapTypes();
    // Для каждой карты заменяем методы
    // получения минимального и максимального разрешения своими значениями
    for (var i=0; i<mapTypes.length; i++) {
        mapTypes[i].getMinimumResolution = function() {return minZoom;}
        mapTypes[i].getMaximumResolution = function() {return maxZoom;}
    }
}

/**
* Если карта выходит за границы allowedBounds, возращаем её обратно
*/
map.limitBounds = function() {
	return;
    var C = map.getCenter();
    // Коорината попадает в допустимый диапазон?
    if (map.options.allowedBounds.contains(C)) {
      return;
    }

    // Если нет, находим ближайшую допустимую точку и центруем карту на ней
    var Y = C.lat();
    var X = C.lng();

    var sw = map.options.allowedBounds.getSouthWest();
    var ne = map.options.allowedBounds.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();}

    map.setCenter(new GLatLng(Y,X));
}

/**
* Обновляем URL в адресной строке браузера (но не в истории)
*/
map.changeUrlFromLatLng = function() {
    // Не обновляем URL, если перешли назад-вперёд или вручную ввели адрес
    // (так как урл уже обновился)
    if (map.url2latlng)
    {
        // Центр экрана (округляем до 6 знаков после запятой)
        coords = map.getCenter().toUrlValue().split(',');
        // lat=55.819765&lng=37.568425&z=17
        var newUrl = $.query
                        .set('lat', coords[0])
                        .set('lng', coords[1])
                        .set('z', map.getZoom());

        if (newUrl.toString() != $.query.toString())
        {
            // не записываем координаты карты в историю (не работает для Opera, WebKit)
            $.history.stop();
            // но изменяем координаты в строке браузера
            window.location.replace('#'+newUrl.toString());
            // сохраняем содержимое адресной строки
            $.query = newUrl;
        }
    }
}

/**
* Обновляем карту сообразно URL в адресной строке
*/
map.changeLatLngFromUrl = function() {
    // Отключаем обратную связь - не изменяем URL после перемещения
    // (урл уже изменён)
    map.url2latlng = false;

    var oldZoom   = map.getZoom();
    var oldCenter = map.getCenter();

    map.zoom   = $.query.get('z');
    map.center = new GLatLng($.query.get('lat'), $.query.get('lng'));

    if (map.center != oldCenter) {
        // Если карта была на том же зуме - стараемся плавно переместить вьюпорт
        if (map.getZoom() == map.zoom) {
            map.panTo(map.center);
        } else  {
            map.setCenter(map.center, map.zoom);
        }
    }
    map.url2latlng = true;
}

/**
 * Устанавливаем исходное положение карты
 */
map.initCenter = function(){
    // Первый заход на сайт или Refresh - определяем хеш
    initialHash = $.history.getCurrent();
    $.event.trigger('historyadd', [initialHash, null]);

    // Перемещаем карту в соответствии с первоначальным хэшем
    // не двигаем карту если в строке url нет координат
    if (initialHash && ($.query.get('lat') || $.query.get('lng'))) {
        map.changeLatLngFromUrl();
    }
    else {
        map.setCenter(map.options.center, map.options.defaultZoom);
    }
}

map.initGeoCoder = function(){
    map.geocoder =  $.extend(new GClientGeocoder(), map.geocoder);
}

$(function() {
    if (GBrowserIsCompatible()) {
        map = $.extend(new GMap2(document.getElementById('map')), map);

		var mapTypeControl = new GMapTypeControl();
		var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(100,10));
		var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(100,10));
		map.addControl(mapTypeControl, topRight );
		map.disableDoubleClickZoom();

        // скроллинг колёсиком
        map.enableScrollWheelZoom();
		map.addControl(new GLargeMapControl3D());

        // Включаем управление с клавиатуры (стрелки, pageUp, pageDown, +, -)
        new GKeyboardHandler(map, window);

        // масштаб x до y
        map.limitZoom();
        // Дозволенные границы карты
        GEvent.addListener(map, 'move', map.limitBounds);

        // Указываем центр карты
		map.initCenter();

        map.initGeoCoder();
        map.initBaseIcon(46);

        // Обновление строки URL
       // GEvent.addListener(map, 'moveend', map.changeUrlFromLatLng);
        //GEvent.addListener(map, 'moveend', map.changeViewport);
       // GEvent.addListener(map, 'zoomend', map.zoomOut);

        // Флаг обратной связи URL->LatLng
        map.url2latlng = true;

        $('#search').GMapFakeControl();
        $('#atms').GMapFakeControl();
        $('#information').GMapFakeControl();

		var point = new GLatLng(55.706853,37.595022);
		//map.createTabbedMarker( point,1,1,1,1,1,1 );
		map.openInfoWindowHtml( point, "<img src=/project/img/logo.gif>" );	

        // перемещение по истории (кнопки вперёд-назад)
        $(window).history(function(e, hash) {
            $.query.queryObject(location.search, location.hash);
            //console.warn('User navigated to: ' + hash || 'Default Page');
            map.changeLatLngFromUrl();
        });
    }
    else {
        alert('Карта не работает с вашим браузером!');
    }
});

/**
 * Базовый маркер
 */
map.initBaseIcon = function(h){
    map.baseIcon.image = '/img/city_only.png';
    map.baseIcon.shadow = null;
    map.baseIcon.imageMap = [0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,40,0,40,1,40,2,40,3,40,4,40,5,40,6,40,7,40,8,40,9,40,10,40,11,40,12,40,13,40,14,40,15,40,16,40,17,40,18,40,19,40,20,40,21,40,22,40,23,40,24,40,25,40,26,40,27,40,28,40,29,40,30,40,31,40,32,40,33,40,34,40,35,40,36,40,37,40,38,40,39,40,40,40,40,39,40,38,40,37,40,36,40,35,40,34,40,33,40,32,40,31,40,30,40,29,40,28,40,27,40,26,40,25,40,24,40,23,40,22,40,21,40,20,40,19,40,18,40,17,40,16,40,15,40,14,40,13,40,12,40,11,40,10,40,9,40,8,40,7,40,6,40,5,40,4,40,3,40,2,40,1,40,0,40,0,39,0,38,0,37,0,36,0,35,0,34,0,33,0,32,0,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1];
    map.baseIcon.iconSize = new GSize(46,h);//46 * 46, 46 * 38 marker size
    map.baseIcon.iconAnchor = new GPoint(16, 38);
    map.baseIcon.infoWindowAnchor = new GPoint(20, 19);
}

/**
 * Иконка маркера
 * @param   string  bankName
 * @return  GIcon
 */
map.atmIcon = function(bankName){
    if (typeof bankName == 'undefined') {
        return map.defaultIcon;
    }

    if (typeof map.atmIconCache[bankName] == 'undefined') {
        map.atmIconCache[bankName] = new GIcon(map.baseIcon, 'images/markers/' + bankName + '.png');
    }
    return map.atmIconCache[bankName];
}

map.createTabbedMarker = function(point, html1, html2, label1, label2 ) {
	//images icons
	if( map.showall ) {
		map.initBaseIcon(38);
		var mapIcon = new GIcon(map.baseIcon);
		mapIcon.image = "/inum.php?group="+group+"&file=/img/i-number.png&all=1";
	} else
	if( group > 1 ) {
		map.initBaseIcon( 46 );
		var mapIcon = new GIcon(map.baseIcon);
		mapIcon.image = "/inum.php?group="+group+"&file="+gicon;
	} else {
		map.initBaseIcon(38);
		var mapIcon = new GIcon(map.baseIcon);
		mapIcon.image = icon;
	}
	//alert(mapIcon.image);
	markerOptions = { icon: mapIcon, zIndexProcess: this.zMarker, draggable: true };
	var marker = new GMarker(point, markerOptions);
	marker.importance = parseInt(group);
	map.activeMarkers ++;
	GEvent.addListener(marker, "click", function() {
		if( group > split ) {
			map.zoomIn(point,true);
			$("#global").animate({top: "-"+map.scrollform+"px"}, {duration:500});
			$("#footer").animate({bottom: "-50px"}, {duration:500});
			$("#scroll").html('Развернуть поиск');
		} else {
			$("#global").animate({top: "-"+map.scrollform+"px"}, {duration:500});
			$("#footer").animate({bottom: "-50px"}, {duration:500});
			$("#scroll").html('Развернуть поиск');
			$.get("/code/xml1.php", { x: Math.round(point.lng()*1E7), y: Math.round(point.lat()*1E7), type: map.datatype, room: map.dataroom }, function(data) {
				map.userefreshmarkers = 0;
				map.openInfoWindowHtml( point, data );				
			});
		} 
		// show mini map marker.showMapBlowup();  
	});
	GEvent.addListener(marker, "mouseover", function(e) {
		$("#float-text").remove();
		if( group > 1 && group > split ) {
			var pcoord = map.transCoord( point );
			$("#float-container").append('<div id="float-text"><div id="shadow"><div>Объявлений в данном районе: <u>'+group+'</u><br>Нажмите, чтобы приблизить карту</div></div></div>');
			$("#shadow").dropShadow({left: 5, top: 5, opacity: 0.2, blur: 0});
			$("#float-text").css( {'position':'absolute','top': pcoord[1],'left':pcoord[0],'z-index':'250' } );
		} else 
		if( split > 1 ) {
			var pcoord = map.transCoord( point );
			$("#float-container").append('<div id="float-text"><div id="shadow"><div>Объявлений по данному адресу: <u>'+group+'</u><br>Нажмите, чтобы посмотреть объявления</div></div></div>');
			$("#shadow").dropShadow({left: 5, top: 5, opacity: 0.2, blur: 0});
			$("#float-text").css( {'position':'absolute','top': pcoord[1],'left':pcoord[0],'z-index':'250' } );
		} else {
			var pcoord = map.transCoord( point );
			$("#float-container").append('<div id="float-text"><div id="shadow"><div><u>Одно</u> объявление в данном районе<br>Нажмите, чтобы посмотреть объявление</div></div></div>');
			$("#shadow").dropShadow({left: 5, top: 5, opacity: 0.2, blur: 0});
			$("#float-text").css( {'position':'absolute','top': pcoord[1],'left':pcoord[0],'z-index':'250' } );
		}
	});
	GEvent.addListener(marker, "mouseout", function(e) {
		$("#float-text").remove();
	});
	this.addOverlay(marker);
    return marker;
}

map.transCoord = function( point ) {
	var msize = this.getSize();
	var bounds = this.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	var lngDelta =  ne.lng() - sw.lng() ;
	var latDelta =  ne.lat() - sw.lat() ;
	pixelX = ( point.lng() - sw.lng() ) * msize.width / lngDelta;
	var level = map.getZoom(); 
	var BitmapSize = Math.pow(2, level-1 ) * 256;
	var BitmapOrigo = BitmapSize / 2;
	var pi = 3.1415926565876;
	var PixelsPerLonRadian = BitmapSize / ( 2 * pi ); 
	var z = Math.sin( pi / 180 * point.lat() ); 
	var pX = BitmapOrigo - 1 * Math.log((1+z)/(1-z)) * PixelsPerLonRadian; 
	var z0 = Math.sin( pi / 180 * ne.lat() );
	var pX0 = BitmapOrigo - 1 * Math.log((1+z0)/(1-z0)) * PixelsPerLonRadian;	
	pixelY = pX - pX0;
	return [ pixelX, pixelY ];
}


map.zMarker = function(marker,b) {
	return map.activeMarkers + marker.importance*10000;
}


/**
*   Добавляем на карту и в память новые маркеры, если их нет на карте и
*   общее число маркеров не превышает допустимый предел
*/
map.addMarkers = function(batch, maxMarkers) {
    $.each(batch, function(i, info) {
        if (typeof map.markers[info.lat+''+info.lng] == 'undefined'
            && map.activeMarkers<map.options.maxMarkers) {
                var latlng = new GLatLng(info.lat/1E6, info.lng/1E6);
                /*if (typeof info.num != 'undefined' && info.num > 1) {
                    info.url = 'multi_marker';
                }*/
                map.markers[info.lat+''+info.lng] = map.createMarker(latlng, info);
                map.activeMarkers++;
        }
    });
    console.log(map.activeMarkers);
}

/**
*   Убираем с карты и из памяти маркеры, которые не попадают в границы bounds
*   Если границы не указаны, убираем все маркеры
*/
map.removeMarkers = function(bounds) {

    var infoWindow = map.getInfoWindow();
    // маркер с открытым infoWindow не удаляем
    var currentLatLng = (infoWindow.isHidden()) ? null : infoWindow.getPoint();
    var doDelete;

    for (j in map.markers) {
        // оставляем маркер с открытым infoWindow
        if (currentLatLng == map.markers[j].getLatLng()) {
            continue;
        }
        // удаляем те, что не оппали в границы
        doDelete = (typeof bounds == 'undefined')
                   || !bounds.containsLatLng(map.markers[j].getLatLng())

        if (doDelete) {
            map.removeOverlay(map.markers[j]);
            delete(map.markers[j]);
            map.activeMarkers--; // число видимых маркеров
        }
    }
}

/**
 * создаём маркер с infowindow при клике
 */
map.createMarker = function(point, info) {
    //bankName, atmId, num

    if (typeof point.lat == 'number') {
        point = new GLatLng(point.lat, point.lng);
    }

    // специконки для нескольких банкоматов в одной точке
    info.num = (info.num>10) ? 'm10' : info.num;
    info.bankName = (info.bankName == 'multi_marker') ? 'marker_'+info.num : info.bankName;

    var marker = new GMarker(point, {icon: map.atmIcon(info.bankName)});

    this.addOverlay(marker);

    marker.bubble(info.atm_id, (info.num>1 || info.num == 'm10'));
    return marker;
}

function sh( id ) {
	if( $("#"+id).css('display','none')) {
		$(".info-bm").hide();
		$("#"+id).slideDown();
	}
}
