var map;
var tiled;
var vectors;
var controls;
var markers;
var selectorCtrl;
var idToMarker;
var markerToId;
var baseUrl = '/map/tiles/';
var inClick = false;
var qsParm = new Array();

// КОНСТАНТЫ
OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
//OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
OpenLayers.DOTS_PER_INCH = 72;
var SHADOW_Z_INDEX = 10;
var MARKER_Z_INDEX = 11;

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
    defaultHandlerOptions: {
        'single': true,
        'double': false,
        'pixelTolerance': 0,
        'stopSingle': false,
        'stopDouble': false
    },

    initialize: function(options) {
        this.handlerOptions = OpenLayers.Util.extend(
        {}, this.defaultHandlerOptions
            );
        OpenLayers.Control.prototype.initialize.apply(
            this, arguments
            );
        this.handler = new OpenLayers.Handler.Click(
            this, {
                'click': this.trigger
            }, this.handlerOptions
            );
    },

    trigger: function(e) {
        if(globalOptions['EnableMapClick']){
			var lonlat = map.getLonLatFromViewPortPx(e.xy);
			onMapClick(lonlat.lon, lonlat.lat);
		}
    }

});

function get_my_url(bounds)
{
    var res = map.getResolution();
    var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
    var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
    var z = map.getZoom();
	
    var path = z + "/" + x + "_" + y + ".gif";
    return baseUrl + path;
}


function init(allowMove, top, left)
{
    if(typeof globalOptions == 'undefined')
        globalOptions = {};
    if(typeof globalOptions['zoomLevel'] == 'undefined')
        globalOptions['zoomLevel'] = '0';
    if(typeof globalOptions['onSelectFile'] == 'undefined')
        globalOptions['onSelectFile'] = '/map/get_descript_by_id.html';
	if(typeof globalOptions['backgroundGraphic'] == 'undefined')
        globalOptions['backgroundGraphic'] = '/map/api/img/marker_shadow.png';
	if(typeof globalOptions['PanTo'] == 'undefined')
        globalOptions['PanTo'] = true;
	if(typeof globalOptions['EnableMapScrollEvent'] == 'undefined')
        globalOptions['EnableMapScrollEvent'] = true;
	if(typeof globalOptions['DisablePrintButton'] == 'undefined')
        globalOptions['DisablePrintButton'] = false;
		
		
	if(typeof allowMove == 'undefined')		
		allowMove = true;
		
	// Смотрим значения из query
	if(typeof queryScale != 'undefined')
		globalOptions['zoomLevel'] = queryScale;
		
    //var bounds = new OpenLayers.Bounds(0, -1536, 2304, 0);
    var bounds = new OpenLayers.Bounds(0, -18944, 18944, 0);

    var options = {
        controls: [],
        maxExtent: bounds,
        resolutions: [18.5, 8.2222222, 4.11111111, 2, 1],
        eventListeners: {
            "moveend": mapScrollEvent
        }
    //restrictedExtent: new OpenLayers.Bounds(0, -6800, 8192, -1400)
    };
	
    map = new OpenLayers.Map('map', options);
	
    tiled = new OpenLayers.Layer.TMS("Брянск", baseUrl, {
        'type':'gif',
        'getURL':get_my_url,
        'buffer':0
    });
	
    //markers = new OpenLayers.Layer.Markers("Объекты");
    markers = new OpenLayers.Layer.Vector(
        "Объекты",
        {
            styleMap: new OpenLayers.StyleMap({
                // Set the external graphic and background graphic images.
                externalGraphic: "/map/images/${type}.png",
                //externalGraphic: "/map/api/img/marker-blue.png",
                backgroundGraphic: globalOptions['backgroundGraphic'],
				
                // Makes sure the background graphic is placed correctly relative
                // to the external graphic.
                backgroundXOffset: 0,
                backgroundYOffset: -7,
				
                // Set the z-indexes of both graphics to make sure the background
                // graphics stay in the background (shadows on top of markers looks
                // odd; let's not do that).
                graphicZIndex: MARKER_Z_INDEX,
                backgroundGraphicZIndex: SHADOW_Z_INDEX,
				
                pointRadius: 10
            }),
            rendererOptions: {
                yOrdering: true
            }
        }
        );

    // делаем события для кликов по маркерам
    markers.events.on({
        'featureselected': onMarkerSelect,
        'featureunselected': onMarkerUnselect
    });
	
    map.addLayers([tiled, markers]);

    qs();
	
    // добавляем основные контролы
	if(allowMove)
	{
	    map.addControl(new OpenLayers.Control.PanZoomBar());
	    map.addControl(new OpenLayers.Control.Navigation());
		
	    //map.addControl(new OpenLayers.Control.MousePosition());
	    //map.addControl(new OpenLayers.Control.LayerSwitcher());
		
	    // селектор маркеров
	    selectorCtrl = new OpenLayers.Control.SelectFeature(markers);
	    map.addControl(selectorCtrl);
	    selectorCtrl.activate();

	    // create an overview map control with the default options
	    var controlOptions = {
	    }
	    var overCtrl = new OpenLayers.Control.OverviewMap(controlOptions);
	    //map.addControl(overCtrl);
	    // expand the overview map control
	    //overCtrl.maximizeControl();
		
	    // контрол клика по карте
	    var click = new OpenLayers.Control.Click();
	    map.addControl(click);
	    click.activate();
		
		if(!globalOptions['DisablePrintButton'])
		{
			var globalDiv = document.getElementById("map").parentNode;

			var printerGlobalDiv = document.createElement('div');
			printerGlobalDiv.setAttribute('id', 'printerGlobalDiv');

			var printerImg = document.createElement('img');
			printerImg.setAttribute('src', 'images/print.gif');
			printerGlobalDiv.appendChild(printerImg);

			var printerEndDiv = document.createElement('div');
			printerEndDiv.setAttribute('id', 'printerEndDiv');

			globalDiv.appendChild(printerGlobalDiv);

			jQuery('#printerGlobalDiv').css('position', 'absolute');
			jQuery('#printerGlobalDiv').css('top', '310');
			jQuery('#printerGlobalDiv').css('left', '230');
			jQuery('#printerGlobalDiv').css('line-height', '28px');
			jQuery('#printerGlobalDiv').css('cursor', 'pointer');
//alert('2');
			jQuery('#printerTextDiv').css('background', 'url("icons/printer_back.png") repeat scroll 0 0 transparent');
			jQuery('#printerImgDiv').css('background', 'url("icons/printer_back.png") repeat scroll 0 0 transparent');
			jQuery('#printerEndDiv').css('background', 'url("icons/printer_back_end.png") repeat scroll 0 0 transparent');
			
			jQuery('#printerGlobalDiv').click(function() {
			
				// Вычисляем позицию области печати
				var widthPx = map.size.w;
				var heightPx = map.size.h;
				var widthMap = map.getExtent().right - map.getExtent().left;
				var heightMap = map.getExtent().top - map.getExtent().bottom;
				
				var kWidth = widthMap / widthPx;
				var kHeight = heightMap / heightPx;
				
				var squareWidth = 640 * kWidth;
				var squareHeight = 500 * kHeight;
				
				var squareLeft = map.getExtent().left + (widthMap - squareWidth)/2;
				var squareTop = map.getExtent().top - (heightMap - squareHeight)/2;	
			
				//window.print();
				var url = "/map/print_map.html?zoom=" + map.getZoom();
				//if(typeof top != 'undefined' && typeof left != 'undefined')
					//url += "&top=" + top + "&left=" + left;
				//else
					//url += "&top=" + map.getExtent().toArray()[3] + "&left=" + map.getExtent().toArray()[0];
				url += "&top=" + squareTop + "&left=" + squareLeft;
					
				var w = 700;
				var h = 800;
				
				//w += 32;
				//h += 96;
				 var win = window.open(url,
				  "Печать", 
				  'width=' + w + ', height=' + h + ', ' +
				  'location=no, menubar=no, ' +
				  'status=no, toolbar=no, scrollbars=yes, resizable=no');
				 win.resizeTo(w, h);
				 win.focus();					
				//window.open(url);
			});	

			jQuery('#printerGlobalDiv').mouseover(function() {
				var globalDiv = document.getElementById("map").parentNode;
				
				var widthPx = map.size.w;
				var heightPx = map.size.h;
				
				var previewX = map.div.offsetLeft + (widthPx - 640)/2;
				var previewY = map.div.offsetTop + (heightPx - 500)/2;
			
				var mapPrintPreviewDiv = document.createElement('div');
				mapPrintPreviewDiv.setAttribute('id', 'mapPrintPreviewDiv');
				globalDiv.appendChild(mapPrintPreviewDiv);
				
				jQuery('#mapPrintPreviewDiv').css('width', '640px');
				jQuery('#mapPrintPreviewDiv').css('height', '500px');
				jQuery('#mapPrintPreviewDiv').css('position', 'absolute');
				jQuery('#mapPrintPreviewDiv').css('top', previewY + 'px');
				jQuery('#mapPrintPreviewDiv').css('left', previewX + 'px');
				jQuery('#mapPrintPreviewDiv').css('opacity', '0.4');
				jQuery('#mapPrintPreviewDiv').css('background-color', 'black');
				jQuery('#mapPrintPreviewDiv').css('line-height', '500px');
				jQuery('#mapPrintPreviewDiv').css('text-align', 'center');
				jQuery('#mapPrintPreviewDiv').css('font-family', 'Verdana');
				jQuery('#mapPrintPreviewDiv').css('font-size', '18px');
				jQuery('#mapPrintPreviewDiv').css('font-weight', 'bold');
				//jQuery('#mapPrintPreviewDiv').css('z-index', '100');
				jQuery('#mapPrintPreviewDiv').css('color', 'white');
				jQuery('#mapPrintPreviewDiv').html('Область печати');
			});
			
			jQuery('#printerGlobalDiv').mouseout(function() {
				jQuery('#mapPrintPreviewDiv').remove();
			});			
		}		
		
	}
	
    //map.addControl(new OpenLayers.Control.OverviewMap());
    //map.zoomToExtent(bounds);
    setZoom(globalOptions['zoomLevel']);

	// Если заданы координаты угла, то позиционируем
	if (typeof top != 'undefined' && typeof left != 'undefined')
	{
		var bounds = map.getExtent();
	    var lonlat = new OpenLayers.LonLat(left + bounds.getWidth()/2, top - bounds.getHeight()/2);
		map.panTo(lonlat);
	}
	
	// Копирайт
	var globalDiv = document.getElementById("map").parentNode;
	var copyWidth = 940;
	var copyHeight = 35;
	var copyX = map.div.offsetLeft + map.size.w - copyWidth;
	var copyY = map.div.offsetTop + map.size.h - copyHeight;
	
	if(qsParm['test'] == 1)
	{
		alert(map.div.offsetTop + map.size.h);
		//alert(my_width);
		
		jQuery('#map_copyright').css('font-size', '10px');
		jQuery('#map_copyright').css('font-family', 'Verdana');
		jQuery('#map_copyright').css('color', 'gray');
		
		jQuery('#map_copyright').css('display', 'inline');
		jQuery('#map_copyright').css('position', 'absolute');
		jQuery('#map_copyright').css('top', copyY + 'px');
		jQuery('#map_copyright').css('left', copyX + 'px');
		jQuery('#map_copyright').css('width', '910px');
	}
}

function addMarkerAtPoint(coord_x, coord_y, img_type)
{
    var ll;
	
    ll = new OpenLayers.LonLat(coord_x, coord_y);
    var features = [];
    var curFeature = new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.Point(ll.lon, ll.lat),
        {
            type: img_type
        }
        );
    features.push(curFeature);
    markers.addFeatures(features);
    return curFeature;
}

function onPopupClose(evt)
{
    // 'this' is the popup.
    selectorCtrl.unselect(this.feature);
}

function onMarkerSelect(evt)
{
    inClick = true;
	
    feature = evt.feature;
    var mId = markerToId[feature.id];
	
    var lonlat = feature.geometry.getBounds().getCenterLonLat();
    lonlat.lon += map.getResolution() * 2500 / 20.522265625;
    lonlat.lat += map.getResolution() * 200 / 20.522265625;
    //var lonlat = new OpenLayers.LonLat(lon, lat);
    if(globalOptions['PanTo']){
		map.panTo(lonlat);
	}
    jQuery.get(globalOptions['onSelectFile'], {
        id: mId,
        uid: Math.random()
        },
    function(data){
        popup = new OpenLayers.Popup.FramedCloud("featurePopup",
            feature.geometry.getBounds().getCenterLonLat(),
            new OpenLayers.Size(10,10),
            data, null, true, onPopupClose);
        popup.autoSize = true;
        feature.popup = popup;
        popup.feature = feature;
        map.addPopup(popup);
        markerSelected(markerToId[feature.id]);
        inClick = false;
    });
}

function onMarkerUnselect(evt)
{
    feature = evt.feature;
    if (feature.popup) {
        popup.feature = null;
        map.removePopup(feature.popup);
        feature.popup.destroy();
        feature.popup = null;
    }
    markerUnselected(markerToId[feature.id]);
}

function clearMapPoints()
{
    // чистим старые объекты
    markers.removeFeatures(markers.features);
    idToMarker = {};
    markerToId = {};
}

// 0 - id
// 1 - marker_num
// 2 - x
// 3 - y
function showPoints(pnts,not_clear_map)
{
    if(inClick == true)
        return false;

    if(not_clear_map==false){

    } else {
        clearMapPoints();
    }
	
    // создаем новые
    for(i=0; i < pnts.length; i++)
    {
        var marker = addMarkerAtPoint(pnts[i][2], pnts[i][3], pnts[i][1]);
        idToMarker['' + pnts[i][0]] = marker;
        markerToId[marker.id] = pnts[i][0];
    }
	
    return true;
}

function deleteMarker(markerId)
{
    marker = idToMarker['' + markerId];
    markers.removeFeatures([marker]);
}

function checkMarker(markerId)
{
    if(typeof idToMarker == "undefined")
        return false;
    if(typeof idToMarker['' + markerId] == "undefined")
        return false;
    return true;
}

function showPopupForMarker(markerId)
{
    marker = idToMarker['' + markerId];
    selectorCtrl.select(marker);
}

function hidePopupForMarker(markerId)
{
    if(inClick == true)
        return false;

    if(markerId != null && markerId != 0)
    {
        marker = idToMarker['' + markerId];
        selectorCtrl.unselect(marker);
    }
    else
    {
        selectorCtrl.unselectAll();
    }
	
    return true;
}

function setZoom(zoomLev)
{
    map.zoomTo(zoomLev);
}

/* Вызывается при скроллировании и изменении масштаба */
function mapScrollEvent(event)
{
	if (qsParm['test'] == '1')
	{
		var widthPx = map.size.w;
		var heightPx = map.size.h;
		var widthMap = map.getExtent().right - map.getExtent().left;
		var heightMap = map.getExtent().top - map.getExtent().bottom;
		
		var kWidth = widthMap / widthPx;
		var kHeight = heightMap / heightPx;
		
		var squareWidth = 640 * kWidth;
		var squareHeight = 500 * kHeight;
		
		var squareLeft = map.getExtent().left + (widthMap - squareWidth)/2;
		var squareTop = map.getExtent().top - (heightMap - squareHeight)/2;	
		
		//alert("size: [" + widthPx + " x " + heightPx + "]; real: [" + widthMap + " x " + heightMap + "]; k: [" + kWidth  + " x " + kHeight +"]");
		//alert("square: [" + squareLeft + " x " + squareTop + "]; real: [" + widthMap + " x " + heightMap + "]; k: [" + kWidth  + " x " + kHeight +"]");
	}

    if(globalOptions['EnableMapScrollEvent'])
	{
		zoom = map.getZoom();
		bounds = map.getExtent().toArray();
		//alert('zoom ' + zoom);
		onViewChanged(bounds[0], bounds[3], bounds[2], bounds[1],  zoom);
	}
}

// чтение параметров из query
function qs()
{
    var query = window.location.search.substring(1);
    var parms = query.split('&');
    for (var i=0; i<parms.length; i++) {
        var pos = parms[i].indexOf('=');
        if (pos > 0) {
            var key = parms[i].substring(0,pos);
            var val = parms[i].substring(pos+1);
            qsParm[key] = val;
        }
    }
}
