var popup;
var map;

var mapMinZoom, mapMaxZoom;
var mapMin, mapMax;
var baseLayers = new Array();
var overlayLayers = new Array();

var layerTopoTC, layerTopoLblTC;
var layerTekLive, layerFireLive, layerDFireLive, cadastreAnno, cadastre, ships, reestrHydro;
var shipsARMI, layerObjects;
var draw, edit, del, attr;
var wfst_port, wfst_rail, drawLn, editLn, delLn;
var ovTopoTC;
var legendControl;
var info;
var selectionControl, selectAttrControl;
var measureControls;
var WMSCapabilitiesFormat = new OpenLayers.Format.WMSCapabilities();
var WMSGetFeatureInfoFormat = new OpenLayers.Format.WMSGetFeatureInfo();
var WFSDescribeFeatureTypeFormat = new OpenLayers.Format.WFSDescribeFeatureType();
var selectedLayer;
var WFSDefition = 0;
var m_gmAttributeTabs;
var sxfPrefix = "sxf_";
var sxfPrefix2 = "SXF_";

var mapBounds = new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508);

function OnMapInit( )
{
	$j.ajax(
		{
			url: "GetMapDescr.aspx",
			type: 'GET',
			async: false,
         cache: false,
			timeout: 30000,
			error: function(){ return true; },
			success: function( response ){ OnMapInitMain(response); }
		}
	);
}

function OnMapInitMain( response )
{
	var smCenter;
   var baseLevel;
   var layersOn;
   var initZoom;
	var mapCenter;
	var isVisible;

	ParseMapDescr(response);

	baseLevel = parseBaseLevel( unescape(params["base"]) );
	LayersOn = parseLayersOn( unescape(params["layersOn"]) );
	mapCenter = parsePoint( unescape(params["center"]) );
	initZoom = parseZoom( unescape(params["zoom"]) );

	GetWFSDefinition( );
	
	map = new OpenLayers.Map(
		$('map'),
			{
				controls: [],
				projection: new OpenLayers.Projection("EPSG:3857"),
				displayProjection: new OpenLayers.Projection("EPSG:4326"),
				units: "m",
				numZoomLevels: 16,//14,
				maxResolution: 156543.0339,
				maxExtent: mapBounds
			}
	);

	OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
	OpenLayers.Util.onImageLoadError = "nodata_white.png";

//-- creating base layers ----
				
	layerTopoTC = new OpenLayers.Layer.TileCache(
	"Топографическая карта",
	"../sevkav",
	"cache1",
	{
		wrapDateLine: false,
		transitionEffect: 'resize',
		isBaseLayer: true,
		projection: "EPSG:3857"
	});
	registerEvents(layerTopoTC);

/*	layerOSM = new OpenLayers.Layer.OSM( "Open Street Maps", 
	{
		isBaseLayer: true
	});*/

	layerOSM = new OpenLayers.Layer.TMS( "Open Street Maps",
		"http://a.tile.openstreetmap.org/",
		{
			type: 'png', getURL: osm_getTileURL,
			displayOutsideMaxExtent: true,
			maxResolution: 156543.0339,
			attribution: '<span style=\"font-family:verdana;font-size:10px\"><a href="http://www.openstreetmap.org/">OpenStreetMap<\/a><\/span>'
		}
	);
	registerEvents(layerOSM);

	layerKosmo = new OpenLayers.Layer.WMS(
		"Космоснимки (irs.gis-lab.info)",
		"http://irs.gis-lab.info/",
		{
			layers: 'irs',
			format: 'image/png',
			transparent: true
		},
		{
			singleTile: false,
			isBaseLayer: true
		}
	);
	registerEvents(layerKosmo);

	var gsat = new OpenLayers.Layer.Google(
        "Google Satellite",
        {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}
    );
	registerEvents(gsat);

	var ortho = new OpenLayers.Layer.TMS( "Ортофото (Ульяновская область, 2.5м)", "../../Ul38/Orthos/full_sm/",
	{ 
		type: 'png', 
		getURL: ortho_getTileURL,
		alpha: true,
		isBaseLayer: true
	});
	registerEvents( ortho );

	var tmsoverlay = new OpenLayers.Layer.TMS( "ЦМР (Ульяновская область, ЦТК ОП 1:25 000)", "../../Ul38/DEMsm/",
	{  
		url: '', serviceVersion: '.', layername: '.', alpha: true,
		type: 'png', getURL: dem2_getTileURL,
		isBaseLayer: true
	});
	registerEvents(tmsoverlay);

	var vzl = new OpenLayers.Layer.TMS(
		'Без подложки', '.',
		{
			getURL            : function(bounds){ return "nodata_white.png"; },
			buffer            : 0,
			isBaseLayer       : true,
			transitionEffect  : 'resize'
		});
	registerEvents( vzl );
				
//-- creating overlays ----
	
	cadastre = new OpenLayers.Layer.ArcGIS93Rest( "Кадастр (Росреестр)",
		"http://maps.rosreestr.ru/ArcGIS/rest/services/Cadastre/Cadastre/MapServer/export",
		// http://projectserver.dataplus.ru/Portal/ <----- ALTERNATIVE SOURCE
		{layers: "show:0,1,2,3,4,5,6,7,8,9,10", TRANSPARENT: true },
		{ visibility: IsOverlayVisible(layersOn,"lv1"), isBaseLayer: false }
	);
	registerEvents(cadastre);

	layerFireLive = new OpenLayers.Layer.WMS(
		"Пожары (FIRMS, MODIS)",
		"../Fires/Request.aspx",
	{
		layers: "all_fires",
		format: "image/png",
		transparent: true
	},
	{ visibility: IsOverlayVisible(layersOn,"lv2") },
	{
		isBaseLayer: false,
		singleTile: true,
		transitionEffect: 'resize',
		minScale: 5000000,
		projection: "EPSG:3857",
		expandLegend: true
	});
	registerEvents(layerFireLive);

	layerDFireLive = new OpenLayers.Layer.WMS(
		"Пожары (Deception)",
		"../DFires/Request.aspx",
	{
		layers: "DFires",
		format: "image/png",
		transparent: true
	},
	{ visibility: IsOverlayVisible(layersOn,"lv3") },
	{
		isBaseLayer: false,
		singleTile: true,
		transitionEffect: 'resize',
		minScale: 5000000,
		projection: "EPSG:3857",
		expandLegend: true
	});
	registerEvents(layerDFireLive);

	//Math.Random will stop caching//
	var moreURL = "http://shipsea.ru/arcgis/rest/services/MSS/Ships/MapServer/export" //&key=" + Math.random();

	ships = new OpenLayers.Layer.ArcGIS93Rest( "Корабли (КИИС МоРе)",
		moreURL,
		{ layers: "show:0,2", TRANSPARENT: true },
		{ visibility: IsOverlayVisible(layersOn,"lv4") },
		{ isBaseLayer: false }
	);

	//function called// //timer// //layer to refresh//
	window.setInterval( UpdateGridLayerState, 30 * 1000, ships );
	registerEvents(ships);

	cadastreAnno = new OpenLayers.Layer.ArcGIS93Rest( "Названия (Росреестр)",
		"http://maps.rosreestr.ru/ArcGIS/rest/services/BaseMaps/Anno/MapServer/export", 
		{layers: "show:0,2", TRANSPARENT: true },
		{ visibility: IsOverlayVisible(layersOn,"lv5") },
		{isBaseLayer: false}
	);
	registerEvents(cadastreAnno);

	var saveStrategy = new OpenLayers.Strategy.Save( {auto:true} );
	wfst_port = new OpenLayers.Layer.Vector("Портовая инфраструктура", 
		{
			styleMap: new OpenLayers.StyleMap(
			{
				'default': new OpenLayers.Style({
				strokeWidth: 2,
				strokeColor: "#ffdd00",
				strokeOpacity: 0.6,
                           
				fillColor: "yellow",
				fillOpacity: 0.25,
				pointRadius: 5
			})
		}),

		strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
		projection: new OpenLayers.Projection("EPSG:3857"),
		        
		protocol: new OpenLayers.Protocol.WFS({
			version: "1.1.0",
			srsName: "EPSG:3857",
			url: "../wfst2/Request.aspx",
			featureNS :  "http://www.intergraph.com/geomedia/gml",
			featureType: "GDB_WFST_AREA",
			geometryName: "Geometry"            		
		}),
		visibility: IsOverlayVisible(layersOn,"lv6")
	});
	registerEvents(wfst_port);

	var saveStrategyRail = new OpenLayers.Strategy.Save( {auto:true} );
	wfst_rail = new OpenLayers.Layer.Vector("Ж/Д инфраструктура", 
		{
			styleMap: new OpenLayers.StyleMap(
			{
				'default': new OpenLayers.Style({
				strokeWidth: 4,
				strokeColor: "#ff2020",
				strokeOpacity: 0.6,                           
				pointRadius: 5
			})
		}),

		strategies: [new OpenLayers.Strategy.BBOX(), saveStrategyRail],
		projection: new OpenLayers.Projection("EPSG:3857"),
		        
		protocol: new OpenLayers.Protocol.WFS({
			version: "1.1.0",
			srsName: "EPSG:3857",
			url: "../wfst2/Request.aspx",
			featureNS :  "http://www.intergraph.com/geomedia/gml",
			featureType: "GDB_WFST_LINE",
			geometryName: "Geometry"           		
		}),
		visibility: IsOverlayVisible(layersOn,"lv7")
	});
	registerEvents(wfst_rail);

	reestrHydro = new OpenLayers.Layer.WMS(
		"Реестр лицензий/свидетельств (РосТрансНадзор)",
		"../reestrHydro/Request.aspx",
	{
		layers: "reestr_akkreditac_04042011_MY_02,peestr01_12_11_MY",
		format: "image/png",
		transparent: true
	},
	{ visibility: IsOverlayVisible(layersOn,"lv8") },
	{
		isBaseLayer: false,
		singleTile: true,
		transitionEffect: 'resize',
		minScale: 5000000,
		projection: "EPSG:3857",
		expandLegend: true
	});
	registerEvents(reestrHydro);

	shipsARMI = new OpenLayers.Layer.WMS(
		"Корабли АРМИ",
		"../ships_wms/Request.aspx",
	{
		layers: "ships",
		format: "image/png",
		transparent: true
	},
	{ visibility: IsOverlayVisible(layersOn,"lv9") },
	{
		isBaseLayer: false,
		singleTile: true,
		transitionEffect: 'resize',
		minScale: 5000000,
		projection: "EPSG:3857",
		expandLegend: true
	});
	registerEvents(shipsARMI);

	layerObjects = new OpenLayers.Layer.Vector("Воздушные суда (FlightRadar24)", {
		strategies: [new OpenLayers.Strategy.Fixed()],
		protocol: new OpenLayers.Protocol.HTTP({
			url: "./getair2.aspx",
			format: new OpenLayers.Format.GeoJSON()
		}),
		visibility: IsOverlayVisible(layersOn,"lv10"),

//		styleMap: styles
		styleMap: new OpenLayers.StyleMap(
		{
			'default': new OpenLayers.Style(
			{
				pointRadius: 10,
				externalGraphic: "img/air.png",
				rotation: "${airAngle}",	//rotation: 90,
				graphicName: "square",
				fillColor: "white",
				fillOpacity: 0.75,
				strokeWidth: 1,
				strokeOpacity: 1,
				strokeColor: "#3333aa"
			})
		}),
	});
	window.setInterval( UpdateGridLayerState2, 30 * 1000, layerObjects );
	registerEvents( layerObjects );

	selectedLayer = new OpenLayers.Layer.Vector(	"Выбранные объекты",	{
		styleMap: new OpenLayers.StyleMap(
		{
			'default': new OpenLayers.Style(
			{
				strokeWidth: 4,
				strokeColor: "lime",
				strokeOpacity: 0.6,
				fillColor: "lime",
				fillOpacity: 0.6,
				pointRadius: 10
			})
		}),
		displayInLayerSwitcher: false
	});
	registerEvents(selectedLayer);

	selectAttrControl = new OpenLayers.Control.GetFeature({
		protocol: new OpenLayers.Protocol.WFS({
			url: "../wfst2/Request.aspx",
			featureType: "GDB_WFST_AREA",
			featureNS: "http://www.intergraph.com/geomedia/gml",
			srsName: "EPSG:3857",
			version: "1.1.0",
			geometryName: "Geometry"
		}),
		box: false,
		hover: false,
		multiple: false,
		single: true,
		clickTolerance: 15                    
	});
	selectAttrControl.events.register( "featureselected", this, onEdtFeatureSelect );
	selectAttrControl.events.register("featureunselected", this, onEdtFeatureUnSelect );            
	map.addControl(selectAttrControl);
					 
	selectionControl = new OpenLayers.Control.GetFeature({
		protocol: new OpenLayers.Protocol.WFS(
		{
			url: "../wfs_sevkav/Request.aspx",
			featureType: [
				"GDB_ALL_FIRES",
				"GDB_WFST_LINE",
				"GDB_WFST_AREA",
				"GDB_WFST_POINT",
				"reestr_akkreditac_04042011_MY_02",
				"peestr01_12_11_MY",

/*				"GDB_V0062131000",
				"GDB_L0061210000",

				"GDB_S00311200001",
				"GDB_S00311200002",*/

				// cities
				"GDB_S0041100000_T",
				"GDB_S0041200000_T",
				"GDB_S0042100000_T",
				"GDB_S0042200000_T",
				"GDB_S0043100000_T",
				"GDB_S0043200000_T"
			],
			featureNS: "http://www.intergraph.com/geomedia/gml",
			srsName: "EPSG:3857",
			version: "1.1.0",
			geometryName: "Geometry"
		}),

		box: false,
		hover: false,
		multiple: false,
		single: false,
		clickTolerance: 15
	});

	selectionControl.events.register("featureselected", this, onFeatureSelect);
	selectionControl.events.register("featureunselected", this, function(e) {
		for (var i = 0; i < $j(m_gmAttributeTabs).children("div").length; i++) {
			if ($j(m_gmAttributeTabs).children("div")[i].id == e.feature.fid.replace(".", "_")) {
				$j(m_gmAttributeTabs).tabs("remove", i);
			}
		}
		if ($j(m_gmAttributeTabs).children("div").length == 0) {
			$j(m_gmAttributeTabs).css("display", "none");
		} else {
			$j(m_gmAttributeTabs).css("display", "");
		}
		selectedLayer.removeFeatures([e.feature]);
	});
	map.addControl(selectionControl);


	legendControl = new OpenLayers.Control.LayerSwitcher({ div: $('legend'), roundedCorner: false,'ascending':true});
	map.addControl(legendControl);
	map.addControl(new OpenLayers.Control.Navigation());
	map.addControl(new OpenLayers.Control.PanZoomBar());
	map.addControl(new OpenLayers.Control.ScaleLine());
	map.addControl(new OpenLayers.Control.Scale());
	map.addControl(new OpenLayers.Control.MousePosition());

	//Construct Measurment
	// style the sketch fancy
	var sketchSymbolizers = {
		"Point": {
			pointRadius: 4,
			graphicName: "square",
			fillColor: "white",
			fillOpacity: 1,
			strokeWidth: 1,
			strokeOpacity: 1,
			strokeColor: "#333333"
		},
		"Line": {
			strokeWidth: 3,
			strokeOpacity: 1,
			strokeColor: "#666666",
			strokeDashstyle: "dash"
		},
		"Polygon": {
			strokeWidth: 2,
			strokeOpacity: 1,
			strokeColor: "#666666",
			fillColor: "white",
			fillOpacity: 0.3
		}
	};

	var style = new OpenLayers.Style();
	style.addRules(
		[ new OpenLayers.Rule( { symbolizer: sketchSymbolizers } ) ]
	);

	var styleMap = new OpenLayers.StyleMap({ "default": style });

	measureControls = {
		line: new OpenLayers.Control.Measure(
		    OpenLayers.Handler.Path, {
				persist: true,
				geodesic: true,
				handlerOptions: {
					layerOptions: { styleMap: styleMap }
        		}
		}),
		polygon: new OpenLayers.Control.Measure(
			OpenLayers.Handler.Polygon, {
				persist: true,
				geodesic: true,
				handlerOptions: {
            	layerOptions: { styleMap: styleMap }
				}
			})
	};

	var control;
	for( var key in measureControls ) {
		control = measureControls[key];
		control.events.on({
			"measure": handleMeasurements,
			"measurepartial": handleMeasurements
		});
		map.addControl(control);
	}

	btnDrawPoly = new OpenLayers.Control.DrawFeature(
		selectedLayer, OpenLayers.Handler.Polygon, //Box
		{ 
			displayClass: "olControlDrawFeaturePolygon", 
			title: "Выделить область",
			featureAdded: RequestPeopleAmount,
			handlerOptions: {holeModifier: "altKey"}
		})
	map.addControl(btnDrawPoly);
       
//---------------------------------
	draw = new OpenLayers.Control.DrawFeature(
        wfst_port, OpenLayers.Handler.Polygon,
        {
            title: "Draw Feature",
            displayClass: "olControlDrawFeaturePolygon",
            multi: true
        }
	);
    
	edit = new OpenLayers.Control.ModifyFeature(
    	wfst_port, {
        title: "Modify Feature",
        displayClass: "olControlModifyFeature"
	});

	del = new DeleteFeature( wfst_port, {title: "Delete Feature"} );

	map.addControl(del);
	map.addControl(edit);
	map.addControl(draw);

//---------------------------------
	drawLn = new OpenLayers.Control.DrawFeature(
        wfst_rail, OpenLayers.Handler.Path,
        {
            title: "Draw Feature",
            displayClass: "olControlDrawFeaturePath",
            multi: true
        }
	);
    
	editLn = new OpenLayers.Control.ModifyFeature(
    	wfst_rail, {
        title: "Modify Feature",
        displayClass: "olControlModifyFeature"
	});

	delLn = new DeleteFeature(	wfst_rail, {title: "Delete Feature"} );

	map.addControl(delLn);
	map.addControl(editLn);
	map.addControl(drawLn);
//---------------------------------

	ovTopoTC = layerTopoTC.clone();
	var overview = new OpenLayers.Control.OverviewMap({
		div: $('overview'),
		size: new OpenLayers.Size(280, 200),
		layers: [ovTopoTC],
		mapOptions: {
				projection: new OpenLayers.Projection("EPSG:900913"),
				units: "m",
				maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508),
				maxResolution: 156543.0339,
				numZoomLevels: 12
		}
	});
	map.addControl(overview);

//-- activate base layer ----

	var base = layerTopoTC;

	if( baseLevel == "b1" )
		base = layerTopoTC;
	if( baseLevel == "b2" )
		base = layerOSM;
	if( baseLevel == "b3" )
		base = layerKosmo;
	if( baseLevel == "b4" )
		base = ortho;
	if( baseLevel == "b5" )
		base = tmsoverlay;
	if( baseLevel == "b6" )
		base = vzl;
	if( baseLevel == "b8" )
		base = gsat;
	map.setBaseLayer( base );


	if( !map.getCenter() )
		map.zoomToMaxExtent();

	smCenter = mapCenter.transform(
            new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
            map.getProjectionObject() // to Spherical Mercator Projection
          );
	map.setCenter( smCenter, initZoom, false, false );


	$j(".accordion .head").click(
			function() {
				$j(this).toggleClass("ui-state-active").next().slideToggle();
				return false;
			})
		.addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")
			.hover(
						function() { $j(this).addClass("ui-state-hover"); },
						function() { $j(this).removeClass("ui-state-hover"); }
					).toggleClass("ui-state-active");

	$j("#searchField").autocomplete({
		source: "ssws_names.aspx",
		minLength: 3,
		select: function(event, ui) {
			if (ui.item) {
				var BBox = new OpenLayers.Bounds.fromString(ui.item.bbox);
				map.zoomToExtent(BBox, true);
			}
		}
	});
				
	$j("#PanButton").button({
		text: false,
        icons: {
            primary: "ui-icon-pan-button"
        }
	}).click( toggleClickQuery );

	$j("#MeasureDistance").button({
		text: false,
		disabled: false,
		icons: { 
			primary: "ui-icon-md-button" 
		}
	}).click( toggleClickQuery );

	$j("#MeasureArea").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-ma-button"
		}
	}).click( toggleClickQuery );

	$j("#CalcPeople").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-mpeople-button"
		}
	}).click( toggleClickQuery );

	$j("#PropertiesButton").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-prop-button"
		}
	}).click( toggleClickQuery );

	$j("#CheckFires").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-fires-button"
		}
	}).click( toggleClickQuery );

	$j("#DrawFeature").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-featdraw-button"
		}
	}).click( toggleClickQuery );

	$j("#ModifyFeature").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-featmodif-button"
		}
	}).click( toggleClickQuery );

	$j("#DelFeature").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-featdel-button"
		}
	}).click( toggleClickQuery );

	$j("#EditAttribures").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-editAttr-button"
		}
	}).click( toggleClickQuery );

	$j("#DrawLine").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-linedraw-button"
		}
	}).click( toggleClickQuery );

	$j("#ModifyLine").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-linemodif-button"
		}
	}).click( toggleClickQuery );

	$j("#DelLine").button({
		text: false,
		disabled: false,
		icons: {
			primary: "ui-icon-linedel-button"
		}
	}).click( toggleClickQuery );
}

function getAttributes(typeName) {

	if( WFSDefition ) {
		for (var k = 0; k < WFSDefition.length; k++) {
			if (WFSDefition[k].typeName == typeName) {
				return WFSDefition[k];
			}
		}
	}

	alert( "WFSDefition not defined or defined incorrect" );
	return null;
}

function toggleClickQuery(e)
{
    if ($j("#PanButton").attr("checked")) {
        //$j("#output").css("height", "40px");
        $j("#output").html("Режим панорамирования");
    }
    
    if ($j("#MeasureDistance").attr("checked")) 
		{
        measureControls['line'].activate();
        $j("#output").html("Измерить расстояние: укажите начальную и конечную (двойным нажатием) точку");
    } else {
        measureControls['line'].deactivate();
    }
    
    if ($j("#MeasureArea").attr("checked"))
		{
        measureControls['polygon'].activate();
        $j("#output").html("Измерить площадь: нарисуйте полигон (ввод последней точки двойным нажанием)");
    } else {
        measureControls['polygon'].deactivate();
    }
    
    if ($j("#CheckFires").attr("checked"))
		{
        $j("#output").html("Анализ пожарной ситуации");
		  callAspScript();
    } 
    else {  
    	//$j("#output").html("");
    }
               
    if ($j("#CalcPeople").attr("checked")) {
        try {

            btnDrawPoly.deactivate();

				  CancelAOI();
				  if( popup )
						popup.destroy();

        } finally {

            btnDrawPoly.activate();
				  $j("#output").html("Определение численности населения: нарисуйте полигон (последняя точка - двойное нажатие)");
        }
    } else {

			btnDrawPoly.deactivate();

			CancelAOI();
			if( popup )
				popup.destroy();						
    }
    
    if ($j("#PropertiesButton").attr("checked")) {
        try {

            selectionControl.deactivate();

        } finally {

            $j("#output").html("Свойства объекта: укажите объект");
            selectionControl.activate();
        }
     } else {

        selectionControl.deactivate();
     }
     
//-------------
    if ($j("#DrawFeature").attr("checked")) {
        try {

            draw.deactivate();

        } finally {

            $j("#output").html("Добавить новый портовый объект");
            draw.activate();
        }
     } else {

        draw.deactivate();
     }

    if ($j("#ModifyFeature").attr("checked")) {
        try {

            edit.deactivate();

        } finally {

            $j("#output").html("Редактировать портовый объект");
            edit.activate();
        }
     } else {

        edit.deactivate();
     }

    if ($j("#DelFeature").attr("checked")) {
        try {

            del.deactivate();

        } finally {

            $j("#output").html("Удалить портовый объект");
            del.activate();
        }
     } else {

        del.deactivate();
     }
//-------------
    if ($j("#DrawLine").attr("checked")) {
        try {

            drawLn.deactivate();

        } finally {

            $j("#output").html("Добавить новый Ж/Д объект");
            drawLn.activate();
        }
     } else {

        drawLn.deactivate();
     }

    if ($j("#ModifyLine").attr("checked")) {
        try {

            editLn.deactivate();

        } finally {

            $j("#output").html("Редактировать Ж/Д объект");
            editLn.activate();
        }
     } else {

        editLn.deactivate();
     }

    if ($j("#DelLine").attr("checked")) {
        try {

            delLn.deactivate();

        } finally {

            $j("#output").html("Удалить Ж/Д объект");
            delLn.activate();
        }
     } else {

        delLn.deactivate();
     }
//--------
}

function GetWFSDefinition( )
{
	var getDefFromCache = false; 

	if( getDefFromCache )
	{
		//--- get WFS definition from cache
		$j.get(
			"wfsDefRequest.aspx", function(response) 
			{ 
				var doc = WFSDescribeFeatureTypeFormat.read(response);
				if(doc)
				{
					WFSDefition = doc.featureTypes;
				}
			}
		); 
	}
	else
	{
		//--- query WFS definition from WFS service

		if( !WFSDefition ) 
		{
			var describeFeatureTypeURL = "";
			describeFeatureTypeURL = "../wfs_sevkav/Request.aspx";

			var params = "";
			params = OpenLayers.Util.getParameterString(
			{
				SERVICE: "WFS",
				REQUEST: "DescribeFeatureType",
				INFO_FORMAT: 'text/xml',
				VERSION: "1.1.0"
			});
			describeFeatureTypeURL = OpenLayers.Util.urlAppend(describeFeatureTypeURL, params);

			OpenLayers.loadURL( describeFeatureTypeURL, '', this,
					function(response) 
					{
						var doc = WFSDescribeFeatureTypeFormat.read(response.responseText);
						if(doc)
						{
							WFSDefition = doc.featureTypes;
						}
				});
		}
	}
}

function isEmpty(e) {

	switch(e) {
		case "":
		case 0:
   	case "0":
		case null:
		case false:
		case typeof this == "undefined":
			return true;

		default : 
			if( e === "undefined" )
			  return true;

			return false;
	}
}

function parsePointNoLimCheck( str ) { 

 var defPoint = new OpenLayers.LonLat( 75.0, 55.0 );
 if( isEmpty(str) )
	return defPoint;

 var comma = str.indexOf(',');

 if( comma == -1 )
 { return defPoint; } 

 var strx = str;
 var stry = strx.substring( comma+1 );

 var x = parseFloat( strx );
 var y = parseFloat( stry );

 if( !x || !y )
 { return defPoint; }

 return new OpenLayers.LonLat( x, y );
}

function parsePoint( str ) { 

 var defPoint = new OpenLayers.LonLat( 75.0, 55.0 );
 if( isEmpty(str) )
	return defPoint;

 var comma = str.indexOf(',');

 if( comma == -1 )
 { return defPoint; } 

 var strx = str;
 var stry = strx.substring( comma+1 );

 var x = parseFloat( strx );
 var y = parseFloat( stry );

 if( !x || !y || x < mapMin.lon || y < mapMin.lat || x > mapMax.lon || y > mapMax.lat )
 { return defPoint; }

 return new OpenLayers.LonLat( x, y );
}

function parseBaseLevel( str )
{
	var defBase = "b1";

	if( isEmpty(str) )
		return defBase;

	return str;
}
function parseLayersOn( str )
{
	var defLevels = "lv5";

	if( isEmpty(str) )
		return defLevels;

	return str;
}
function parseZoom( str )
{
	var defZoom = 3;
	var zoom = parseInt( str );

	if( !zoom )
		return defZoom;

	if( zoom < mapMinZoom )
		return defZoom;
	if( zoom > mapMaxZoom )
		return defZoom;
	return zoom;
}

function getParams() 
{
	var idx = document.URL.indexOf('?');
	var tempParams = new Object();
	if (idx != -1) 
	{
		var pairs = document.URL.substring(idx+1, document.URL.length).split('&');
		for (var i=0; i<pairs.length; i++) 
		{
			nameVal = pairs[i].split('=');
			tempParams[nameVal[0]] = nameVal[1];
		}
	 }
	return tempParams;
}

var params = getParams();

function IsOverlayVisible( layersOn, lvName )
{
	if( LayersOn.search( lvName ) == -1 )
		return false;
	return true;
}

function registerEvents(layer) {
    map.addLayer(layer);

    layer.events.register("loadstart", layer, function() {
        $j(layer.labelSpan).children("span.progress").html("<img src='./img/spinner.gif' style='width: 13px; height: 13px' />");
    });
    layer.events.register("tileloaded", layer, function() {
    });
    layer.events.register("loadend", layer, function() {
        $j(layer.labelSpan).children("span.progress").html("");
    });
}

function highlightFeature(fid) {
	for (var i = 0; i < selectedLayer.features.length; i++) {
		if (selectedLayer.features[i].fid == fid) {
			selectedLayer.features[i].style = OpenLayers.Util.extend(
				{},
				OpenLayers.Feature.Vector.style['default']
			);
			OpenLayers.Util.extend(selectedLayer.features[i].style,{
				strokeWidth: 4,
				strokeColor: "red",
				strokeOpacity: 0.8,
				fillColor: "red",
				fillOpacity: 0.8,
				pointRadius: 10
			});
		} 
		else 
		{
			selectedLayer.features[i].style = null;
		}
	};
	selectedLayer.redraw();
}

function ortho_getTileURL(bounds)
{
	var res = this.map.getResolution();
	var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
	var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
	var z = this.map.getZoom();

	var ULMapBounds = new OpenLayers.Bounds(5081830,6917770,5580000,7346894);
	var mapMinZoom = 0;
	var mapMaxZoom = 16;

	if (ULMapBounds.intersectsBounds( bounds ) && z >= mapMinZoom && z <= mapMaxZoom ) 
	{
		//console.log( this.url + z + "/" + x + "/" + y + "." + this.type);
		return this.url + z + "/" + x + "/" + y + "." + this.type;
	} 
	else 
	{
		return "nodata_white.png";
	}
}		

function dem2_getTileURL(bounds)
{
	var ULMapBounds = new OpenLayers.Bounds(5081830,6917770,5580000,7346894);
	var mapMinZoom = 0;
	var mapMaxZoom = 15;

	var res = this.map.getResolution();
	var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
	var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
	var z = this.map.getZoom();

	if (ULMapBounds.intersectsBounds( bounds ) && z >= mapMinZoom && z <= mapMaxZoom ) 
	{
		//console.log( this.url + z + "/" + x + "/" + y + "." + this.type);
		return this.url + z + "/" + x + "/" + y + "." + this.type;
	} 
	else 
	{
		return "nodata_white.png";
	}
}		

function StartPeopleCalculatorService( )
{

    $j.get(
		"calculatepeople.aspx", function(response) { alert(response); }
	 );
}

function CancelAOI()
{
	if( selectedLayer.features.length )
		selectedLayer.removeAllFeatures();
}

function onPopupCloseSimple2(evt) 
{
	//if( this.feature.layer )
		this.destroy();

	CancelAOI();
}

function UpdateAttributes()
{
   var attr = new OpenLayers.Control.GetFeature({
        title: "Edit Attribures",
        trigger: function() {
            if(edit.feature) {
                edit.selectControl.unselectAll();
            }
        },
        displayClass: "olControlEditAttributes"
    });
}

function UpdateGridLayerState2( ) 
{
	var layer = layerObjects;

	if( layer && layer.getVisibility() )
	{
		layer.loaded = false;
		layer.setVisibility(true);
		//layer.mergeNewParams( { 'key': Math.random() } );
		layer.refresh({ force: true, params: { 'key': Math.random()} });
	}
}

function UpdateGridLayerState( )
{			
	if( ships && ships.getVisibility() )
	{
		var layer = ships;
		//setting loaded to false unloads the layer//
		layer.loaded = false;

		//setting visibility to true forces a reload of the layer//
		layer.setVisibility(true);

		//the refresh will force it to get the new data//
		layer.mergeNewParams( { 'key': Math.random() } );
		//- <3 from Thqr -//

		// code below should work for vector layers
      //layer.refresh({ force: true, params: { 'key': Math.random()} });
	}
}

function onEdtFeatureSelect( e )
{
	
}

function onEdtFeatureUnSelect( e )
{
    for (var i = 0; i < $j(m_gmAttributeTabs).children("div").length; i++) {
        if ($j(m_gmAttributeTabs).children("div")[i].id == e.feature.fid.replace(".", "_")) {
            $j(m_gmAttributeTabs).tabs("remove", i);
        }
    }
    if ($j(m_gmAttributeTabs).children("div").length == 0) {
        $j(m_gmAttributeTabs).css("display", "none");
    } else {
        $j(m_gmAttributeTabs).css("display", "");
    }
    selectedLayer.removeFeatures([e.feature]);
}

function onFeatureSelect( e )
{
	var i;
	var block = "";
	selectedLayer.addFeatures([e.feature]);
	var attDefs1 = getAttributes(e.feature.type);
	var numOfAtts = 0;

	if( attDefs1 )
		numOfAtts = attDefs1.properties.length;

	if( $j("#gmAttributeDialog").length == 0 )
	{
		block = "";
		block += "<div id='gmAttributeDialog' title='Свойства объектов'>";
		block += "<div id='gmAttributeTabs'>";
		block += "<ul>";
		block += "</ul>";
		block += "</div>";
		block += "</div>";

		$j("#output").html(block);

			m_gmAttributeTabs = $j("#gmAttributeTabs").tabs(
			{
				select: function(event, ui) { highlightFeature(ui.panel.attributes.name.value); }
			}
		);

		$j("#gmAttributeDialog").dialog(
			{
				height: 600,
				width: 600,
				modal: false,
				close: function(event, ui) { selectedLayer.removeAllFeatures(); }
			}
		);
	}

	block = "";
	block += "<div name='" + e.feature.fid + "' id='" + e.feature.fid.replace(".", "_") + "'>";
	block += "<table class='gmAttributesTable' border='0' cellspacing='0' cellpadding='0' width='95%'>";
	block += "<thead>";
	block += "<tr class='gmAttributesHeaderRow'><th class='gmAttributesHeaderCell'>Атрибут</th><th class='gmAttributesHeaderCell'>Значение</th></tr>";
	block += "</thead>";
	block += "<tbody>";

	for( i = 0; i < numOfAtts; i++ ) {
		if( attDefs1.properties[i].name.indexOf("Geometry") == -1 && attDefs1.properties[i].name.indexOf("GEOMETRY") ) 
		{
		 var prefix = attDefs1.properties[i].name.substring(0,sxfPrefix.length);
		 if( prefix == sxfPrefix || prefix == sxfPrefix2 || attDefs1.properties[i].name == "ID1" )
		 {}
		 else 
		 {
			block += "<tr class='" + (((i % 2) == 0) ? "gmAttributesDataRowEven" : "gmAttributesDataRowOdd") + " gmAttributesDataRow'>";
			block += "<td class='gmAttributesNameCell gmAttributesCell'>" + attDefs1.properties[i].name.replace(/_/g, "&nbsp;") + "</td>";
			if (e.feature.attributes.hasOwnProperty(attDefs1.properties[i].name)) {
				if (attDefs1.properties[i].localType == "anyURI") {
					block += "<td class='gmAttributesValueCell gmAttributesCell'><a href='" + e.feature.attributes[attDefs1.properties[i].name] + "'>" + e.feature.attributes[attDefs1.properties[i].name] + "</a></td>";
				} else {
					block += "<td class='gmAttributesValueCell gmAttributesCell'>" + e.feature.attributes[attDefs1.properties[i].name] + "</td>";
				}
         }
			else {
         	block += "<td class='gmAttributesValueCell gmAttributesCell'>&nbsp;</td>";
			}
         block += "</tr>";
		 }

		}
	}

	block += "</tbody>";
	block += "</table>";
	block += "</div>";

	$j(m_gmAttributeTabs).append(block);

	$j(m_gmAttributeTabs).tabs("add", "#" + e.feature.fid.replace(".", "_"), e.feature.fid.replace(/_/g, "&nbsp;").replace(".", " - "));
	$j(m_gmAttributeTabs).css("display", "");
	if (!$j("#gmAttributeDialog").dialog("isOpen")) {
		$j("#gmAttributeDialog").dialog("open");
	}

	$j(m_gmAttributeTabs).tabs("select", $j(m_gmAttributeTabs).tabs("length") - 1);
                    highlightFeature(e.feature.fid);
}

function handleMeasurements(event) {
	var geometry = event.geometry;
	var units = event.units;
	var order = event.order;
	var measure = event.measure;

	if (order == 1) {
		$j("#output").html("Длина: " + measure.toFixed(3) + " " + units);
	} else {
		$j("#output").html("Площадь: " + measure.toFixed(3) + " " + units + "<sup>2</" + "sup>");
	}
}

function RequestPeopleAmount()
{
	var edt = selectedLayer;

	if( edt.features.length == 0 )
	{
		alert( "Область интереса не определена" );
	}
	else
	{
		for( var i=0; i<edt.features.length-1; i++ )
			selectedLayer.removeFeatures( edt.features[i] )

		var feature = edt.features[edt.features.length-1]; // get first area only

		var area = feature.geometry.getArea();
		var centerFixed = feature.geometry.getBounds().getCenterLonLat();

		var verts = feature.geometry.getVertices();

		var query = "people.aspx?Num=" + (verts.length+1) + "&Verts=" + verts + "," + verts[0];

		for( i=0; i<verts.length+1; i++ )
		{
			query = query.replace( " ", "," );
			query = query.replace( "POINT(", "" );
			query = query.replace( ")", "" );
		}

		var block = "<div id='docs'><center>Обработка запроса...</center>";
		block += "<center><img src='./img/spinner.gif' style='width: 16px; height: 16px' /></center>"
		block += "</div>";

		var popup0 = new OpenLayers.Popup.FramedCloud( "featurePopup", centerFixed,
							new OpenLayers.Size(250,100), block, null, true, onPopupCloseSimple2 );
		map.addPopup(popup0, true);

    	$j.get( query, function(response) {

			popup0.destroy();

			popup = new OpenLayers.Popup.Anchored( "featurePopup", centerFixed, //FramedCloud
							new OpenLayers.Size(350,200), response, null, true, onPopupCloseSimple2 );

			map.addPopup(popup, true);
		});
	}
}

var DeleteFeature = OpenLayers.Class(OpenLayers.Control, {
    initialize: function(layer, options) {
        OpenLayers.Control.prototype.initialize.apply(this, [options]);
        this.layer = layer;
        this.handler = new OpenLayers.Handler.Feature(
            this, layer, {click: this.clickFeature}
        );
    },
    clickFeature: function(feature) {
        // if feature doesn't have a fid, destroy it
        if(feature.fid == undefined) {
            this.layer.destroyFeatures([feature]);
        } else {
            feature.state = OpenLayers.State.DELETE;
            this.layer.events.triggerEvent("afterfeaturemodified", 
                                           {feature: feature});
            feature.renderIntent = "select";
            this.layer.drawFeature(feature);
        }
    },
    setMap: function(map) {
        this.handler.setMap(map);
        OpenLayers.Control.prototype.setMap.apply(this, arguments);
    },
    CLASS_NAME: "OpenLayers.Control.DeleteFeature"
});

function ParseMapDescr( descr )
{
	var i = 0;
	var from, to, sub;

// parse: mapMin, mapMax
	sub = descr;
	from = sub.indexOf( 'MapExtentX={' );
	sub = sub.substring( from );
	to = sub.indexOf( '}' );

	var mapExtentX = sub.substring( 12, to );

	sub = descr;
	from = sub.indexOf( 'MapExtentY={' );
	sub = sub.substring( from );
	to = sub.indexOf( '}' );
	var mapExtentY = sub.substring( 12, to );

	var p1 = parsePointNoLimCheck( mapExtentX );
	var p2 = parsePointNoLimCheck( mapExtentY );

	mapMin = new OpenLayers.LonLat( p1.lon, p2.lon );
	mapMax = new OpenLayers.LonLat( p1.lat, p2.lat );
//	alert( "extent: " + mapMin.lon +","+ mapMin.lat +", max="+ mapMax.lon+","+mapMax.lat );

//parse: mapMinZoom, mapMaxZoom
	sub = descr;
	from = sub.indexOf( 'MinZoom={' );	
	sub = sub.substring( from );
	to = sub.indexOf( '}' );
	mapMinZoom = parseInt( sub.substring( 9, to ) );

	sub = descr;
	from = sub.indexOf( 'MaxZoom={' );	
	sub = sub.substring( from );
	to = sub.indexOf( '}' );
	mapMaxZoom = parseInt( sub.substring( 9, to ) );
//alert( "zoom: "+mapMinZoom+","+mapMaxZoom );

//parse: baseLayers = new Array();
	sub = descr;
	from = sub.indexOf( 'BaseLayers={' );
	sub = sub.substring( from );
	to = sub.indexOf( '}' );
	baseLayers[i] = sub.substring( 12, to );

	sub = sub.substring( 12 + baseLayers[i].length + 1 );
	i++;

	while( sub[0] == ',' && sub[1] == '{' )
	{
		to = sub.indexOf( '}' );
		baseLayers[i] = sub.substring( 2, to );
		sub = sub.substring( 2 + baseLayers[i].length + 1 );
//alert( "base: "+ baseLayers[i] + ", sub " + sub );
		i++;
   }

//parse: overlayLayers = new Array();
	sub = descr;
	from = sub.indexOf( 'Overlays={' );
	sub = sub.substring( from );
	to = sub.indexOf( '}' );
	overlayLayers[i] = sub.substring( 10, to );

	sub = sub.substring( 10 + overlayLayers[i].length + 1 );
	i++;

	while( sub[0] == ',' && sub[1] == '{' )
	{
		to = sub.indexOf( '}' );
		overlayLayers[i] = sub.substring( 2, to );
		sub = sub.substring( 2 + overlayLayers[i].length + 1 );
//alert( "ovl: "+ overlayLayers[i] + ", sub " + sub );
		i++;
   }
}

function callAspScript() {
			
	//popitup('fireparams.html');

	//myTabs.tabs('add', './fireparams2.html', 'Пожароопасность');

	alert("Not implemented yet");
}

function popitup(url) 
{
	newwindow=window.open(url,'name','height=500,width=350');
	if (window.focus) {newwindow.focus()}
	return false;
}

function dataLoaded(event) 
{
	// 'this' is layer
	this.map.zoomToExtent(event.object.getDataExtent());
}

// get tile boundaries
function osm_getTileURL(bounds) 
{
	var res = this.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 = this.map.getZoom();
	var limit = Math.pow(2, z);

	if (y < 0 || y >= limit) {
		return "nodata_white.png"; //OpenLayers.Util.getImagesLocation() + "404.png";
	} 
	else 
	{
		x = ((x % limit) + limit) % limit;
		return this.url + z + "/" + x + "/" + y + "." + this.type;
	}
}

