var pbbox = [];
function kresli_print(){
	var mierka = $('input[name=form_mierka]:checked').val();
	var papier = $('input[name=form_papier]:checked').val();
	var idm = mierka + papier;
	var sx = parseInt(olMapa.map.getCenter().lon);
	var sy = parseInt(olMapa.map.getCenter().lat);

	if( pbbox[idm] == undefined ){
		data = {
			form_papier: papier,
			form_mierka: mierka
		};
		$.post("/json/print_bbox/", data, function(res){
			pbbox[idm] = res;
			var b = res;
			var wkt = "POLYGON (";
			wkt += b.xmin + sx +" ";
			wkt += b.ymin + sy +",";
			wkt += b.xmin + sx +" ";
			wkt += b.ymax + sy +",";
			wkt += b.xmax + sx +" ";
			wkt += b.ymax + sy +",";
			wkt += b.xmax + sx +" ";
			wkt += b.ymin + sy +",";
			wkt += b.xmin + sx +" ";
			wkt += b.ymin + sy +")";
			olMapa.kresli_tlacoveWKT(wkt);
		}, "json");
	} else {
		var b = pbbox[idm];
		var wkt = "POLYGON (";
		wkt += b.xmin + sx +" ";
		wkt += b.ymin + sy +",";
		wkt += b.xmin + sx +" ";
		wkt += b.ymax + sy +",";
		wkt += b.xmax + sx +" ";
		wkt += b.ymax + sy +",";
		wkt += b.xmax + sx +" ";
		wkt += b.ymin + sy +",";
		wkt += b.xmin + sx +" ";
		wkt += b.ymin + sy +")";
		olMapa.kresli_tlacoveWKT(wkt);
	}

}

function zmaz_print(){
	if(olMapa.vrstvy['olPrintBBox'] != undefined){
		olMapa.map.removeLayer(olMapa.vrstvy['olPrintBBox']);
		olMapa.vrstvy['olPrintBBox'] = null;
	}
}


var nastavenie_merania = {
	displayUnits: null,
	handlerOptions: {
		persist: true
	}
};

var measureControls = {
	mline: new OpenLayers.Control.Measure( OpenLayers.Handler.Path, nastavenie_merania ),
	mpolygon: new OpenLayers.Control.Measure( OpenLayers.Handler.Polygon, nastavenie_merania )
};

var aktivnaVrstva = {
	vrstvy: [],
	register_selectov: [],
	tlacitko: null,
	pridajVrstvu: function(id, nazov, triedy){
		this.vrstvy[id] = {nazov: nazov, triedy: triedy, zapnuta: false};
	},
	zapniVrstvu: function(id){
		if(this.jeAktivna(this.vrstvy[id])){
			var text = '<option id="sel_'+ id +'" value="'+ id +'">'+ this.vrstvy[id].nazov +'</option>';
			$('#aktivna_vrstva').append(text);
		}
		this.vrstvy[id].zapnuta = true;
	},
	vypniVrstvu: function(id){
		$('#sel_'+ id).remove();
		this.vrstvy[id].zapnuta = false;
	},
	reset: function(){
		if($("#aktivna_vrstva").val()){	this.register_selectov[this.tlacitko] = $("#aktivna_vrstva").val(); }
		this.tlacitko = tlacitko;
		$('#aktivna_vrstva').empty();
		for(var i in this.vrstvy){
			if(this.jeAktivna(this.vrstvy[i]) && this.vrstvy[i].zapnuta){
				var text = '<option id="sel_'+ i +'" value="'+ i +'">'+ this.vrstvy[i].nazov +'</option>';
				$('#aktivna_vrstva').append(text);
			}
		}

		if (this.register_selectov[this.tlacitko]) { $("#sel_" + this.register_selectov[this.tlacitko]).attr("selected", "selected"); }
	},
	jeAktivna: function(vrstva){
		for(var i in vrstva.triedy){
			if(vrstva.triedy[i] == this.tlacitko){
				return true;
			}
		}
		return false;
	}
};

var olMapa = {
	vrstvy: [],
	dotaz_vrstvy: [],

	vrstva_konf: null,
	vrstva_konf_base: null,
	map: null,
	bod_kliku: null,
	znacky_pocet: 0,
	zb: null,
	
	init: function(){
		var map_konf = {
			controls:[],
			theme: null,
			units: config.units,
			projection: config.projection,
			maxExtent: new OpenLayers.Bounds(config.maxExtent[0],config.maxExtent[1],config.maxExtent[2],config.maxExtent[3])
		};

		olMapa.vrstva_konf = {/*scales: config.scales,*/resolutions: config.resolutions, units: config.units, projection: config.projection, visibility: false, 'buffer': 0};
		olMapa.vrstva_konf_base = {/*scales: config.scales,*/resolutions: config.resolutions, units: config.units, projection: config.projection, isBaseLayer: true, 'buffer': 1, transitionEffect: 'resize'};

		olMapa.map = new OpenLayers.Map("map", map_konf);

		olMapa.map.addControl(new OpenLayers.Control.PanZoomBar({div:OpenLayers.Util.getElement('panzoom_panel'), slideFactor: 250}));
		olMapa.map.addControl(new OpenLayers.Control.ScaleLine());
		olMapa.map.addControl(new OpenLayers.Control.Scale(OpenLayers.Util.getElement('mierka')));
		olMapa.map.addControl(new OpenLayers.Control.MousePosition({div:OpenLayers.Util.getElement('koordinaty')}));
		olMapa.map.addControl(new OpenLayers.Control.Attribution());

		olMapa.map.addControl(new OpenLayers.Control.Navigation());

		olMapa.map.events.register('click', olMapa.map, function(e) {
			bod_kliku = olMapa.map.getLonLatFromViewPortPx(e.xy);

			switch(tlacitko){
			case 'identify': olMapa.dotaz(e); break;
			case 'bod':
				$("#bod_x_input").val(e.xy.x);
				$("#bod_y_input").val(e.xy.y);
				$("#bod_text").dialog("open");
				break;
			}
		});

		olMapa.map.events.register('zoomend', olMapa.map, function(e){
			olMapa.zmenenyZoom();
		});

		olMapa.map.events.register('moveend', olMapa.map, function(e){
			if (zalozka == 'tlac'){ kresli_print();	}
		});

		var nav = new OpenLayers.Control.NavigationHistory();
		olMapa.map.addControl(nav);

		var nav_panel = new OpenLayers.Control.Panel( {div: OpenLayers.Util.getElement('panel-nav')} );
		nav_panel.addControls([nav.next, nav.previous]);
		olMapa.map.addControl(nav_panel);

		OpenLayers.Feature.Vector.style['default'].strokeWidth = 2;
		var mcontrol;
		for(var key in measureControls) {
			mcontrol = measureControls[key];
			mcontrol.events.on({ 
				"measure": olMapa.handleMeasurements, 
				"measurepartial": olMapa.handleMeasurements 
			});
			olMapa.map.addControl(mcontrol);
		}
		//----- create overview - begin -----
		if( config.overview_image != "-") {
			var ov_image = new OpenLayers.Layer.Image('Nahladova vrstva',
				"/media/" + config.overview_image,
				new OpenLayers.Bounds(config.overview_bounds[0],config.overview_bounds[1],config.overview_bounds[2],config.overview_bounds[3]),
				new OpenLayers.Size(config.overview_size[0], config.overview_size[1]),
				{numZoomLevels: 1, alwaysInRange: true}
			);
			var ov_options = { layers: [ov_image], size: new OpenLayers.Size(config.overview_size[0], config.overview_size[1]) };
			var ovControl = new OpenLayers.Control.OverviewMap(ov_options);
			ovControl.isSuitableOverview = function() { return true; }; // the overview map will never zoom or recenter itself
			olMapa.map.addControl(ovControl);
			//----- moving of copyright -----
			$('#olControlOverviewMapMaximizeButton').click(function(){ $('.olControlAttribution').css('right', config.overview_size[0]+ 30 +'px');});
			$('#OpenLayers_Control_minimizeDiv').click(function(){ $('.olControlAttribution').css('right', '2px'); });
		}
		//----- create overview - end -----

	},
	zmenenyZoom: function(){
		var zl = olMapa.map.getZoom();
		$('#zoom_level').html('ZL: '+ zl);
		$('.chb_vrstva').each(function(){
			if(zl < $(this).attr('rel')){ // vrstva sa ma vypnut
				if( $(this).attr('checked') ){
					var vrstva = $(this).attr('id');
					olMapa.vrstvy[vrstva].setVisibility(false);
					aktivnaVrstva.vypniVrstvu(vrstva);
					$('.legenda_' + vrstva).hide();
				}

				$(this).attr('disabled',true);
				$(this).next('label').addClass('vypnute');
			} else { // vrstva sa ma zapnut
				if(!$(this).parent().parent().prev().children().children().hasClass("vypnute")){
					if( !$(this).parent().parent().hasClass('vypnute') ){
						$(this).attr('disabled',false);
					}

					if( $(this).attr('checked') && !$(this).attr('disabled') && $(this).next('label').hasClass('vypnute') ){
						var vrstva = $(this).attr('id');
						olMapa.vrstvy[vrstva].setVisibility(true);
						aktivnaVrstva.zapniVrstvu(vrstva);
						$('.legenda_' + vrstva).show();
					}
					$(this).next('label').removeClass('vypnute');
				}
			}
		});

		// zmeni vybranu mierku pre tlac
		var mierka = Math.round(olMapa.map.getScale());
		//$('#form_mierka_'+ mierka).click();
		$('#form_mierka_'+ mierka).attr('checked', 'checked');
		if (zalozka == 'tlac'){ kresli_print();	}
	},
	pridajPodkladovuVrstvu: function(pv){
	//id,nazov,wms_url,wms_vrstva,wms_map,format,wms_vrstva_original){
		var id = 'pvrstva'+ pv.id;
		olMapa.vrstva_konf_base.attribution = pv.copyright;
		olMapa.vrstvy[id] = new OpenLayers.Layer.WMS(pv.nazov, pv.wms_url,
			{
				layers: pv.wms_vrstva,
				format: 'image/'+ pv.format,
				tckey: config.tckey
			},
			olMapa.vrstva_konf_base);

		olMapa.dotaz_vrstvy[id] = {vrstva: pv.wms_vrstva_original, id: pv.id};

	// TODO #5: NIE PODKLADOVE VRSTVY V SELEKTE AKTIVNEJ VRSTVY
	//	aktivnaVrstva.pridajVrstvu(id, pv.nazov);
	},
	pridajVrstvu: function(v){
	//id,nazov,wms_url,wms_vrstva,wms_map,format,wms_vrstva_original){
		var id = 'vrstva'+ v.id;
		olMapa.vrstva_konf.attribution = v.copyright;
		if(v.wms_url == v.wms_url_original) {
			olMapa.vrstva_konf.singleTile = true;
			var map_file = v.wms_map;
		} else {
			olMapa.vrstva_konf.singleTile = false;
			var map_file = null;
		}
                olMapa.vrstvy[id] = new OpenLayers.Layer.WMS(v.nazov, v.wms_url,
			{
				map: map_file,
				layers: v.wms_vrstva,
				transparent: true,
				format: 'image/'+ v.format,
				tckey: config.tckey
			},
			olMapa.vrstva_konf);

		olMapa.dotaz_vrstvy[id] = {vrstva: v.wms_vrstva_original, id: v.id};

		var triedy = [];
		if(v.ident) triedy.push('identify');
		aktivnaVrstva.pridajVrstvu(id, v.nazov, triedy);
	},
	zobraz: function(zoom_level, y, x){
		olMapa.map.setCenter(new OpenLayers.LonLat(y,x), zoom_level);
	},
	prepniMeranie: function(typ) {
		for(key in measureControls) {
			var control = measureControls[key];
			if(typ == key) {
				control.activate();
			} else {
				control.deactivate();
				$('#meranie').empty();
			}
		}
	},
	handleMeasurements: function(event) {
		var geometry = event.geometry;
		var units = event.units; 
		var order = event.order;
		var measure = event.measure;
		var out = "";
		if(order == 1) {
			out += "dĺžka: " + measure.toFixed(3) + " " + units;
		} else {
			out += "plocha: " + measure.toFixed(3) + " " + units + "<sup>2</sup>";
		}
		$('#meranie').html(out);
	},
	dotaz: function(e){
		$('#load').show();
		var id = $('#aktivna_vrstva').val();
		if(id != null){ // ak nie je definovana ziadna vrstva posle sa dotaz na neexistujucu
			var url = "/json/feature_info/"+ olMapa.dotaz_vrstvy[id].vrstva +"/";
		} else {
			var url = '/json/feature_info/none/';
		}

		var parameters = {
			bbox: olMapa.vrstvy[id].map.getExtent().toBBOX(),
			x: e.xy.x,
			y: e.xy.y,
			width: olMapa.vrstvy[id].map.size.w,
			height: olMapa.vrstvy[id].map.size.h
		}

		$.getJSON(url, parameters, function(data){
			atrOkno.zobraz(data.text, data.vrstva);
			var id = $('#aktivna_vrstva').val();

			if(id != null){
				$.getJSON('/json/zoomlevel/layer/'+ olMapa.dotaz_vrstvy[id].id +'/', function(zl){ // zisti sa zoomlevel pre vrsvu
					$('.zobr_obj').click(function(){
						$.getJSON($(this).attr('rel'), function(res){
							olMapa.kresliWKT(res,zl);
						});
					});
				});
			} else {
				$('#load').hide();
			}

		});
	},
	stitky: [],
	kresliZnacku: function(x, y, text){
		if(text != null){ // null vracia dialog na ziskanie text v pripade ze sa stlaci Cancel
			var meno = 'olznacky';
			var bod = new OpenLayers.Pixel(parseInt(x), parseInt(y));
			var suradnice = olMapa.map.getLonLatFromViewPortPx(bod);

			if(olMapa.znacky_pocet == 0) {
				olMapa.vrstvy[meno] = new OpenLayers.Layer.Markers(meno);
				olMapa.map.addLayer(olMapa.vrstvy[meno]);
			}

			// nastavenie vyzoru znacky
			var size = new OpenLayers.Size(20, 34);
			var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
			var icon = new OpenLayers.Icon('/media/gisplan/red_bod.png', size, offset);
			olMapa.vrstvy[meno].addMarker(new OpenLayers.Marker(suradnice, icon));
			olMapa.znacky_pocet++;

			// stitok ku znacke
			if(text != ''){
/*				var posunuty_bod = {x: bod.x + (size.w / 2), y: bod.y}
				var posunute_suradnice = olMapa.map.getLonLatFromViewPortPx(posunuty_bod);
				var stitok = new OpenLayers.Popup.Anchored('stitok'+ olMapa.znacky_pocet,
					suradnice,
					new OpenLayers.Size(0, 0),
					text,
					{size:size, offset:offset},
					false
				);*/

				var stitok = new OpenLayers.Popup(
					"stitok"+ olMapa.znacky_pocet,
					suradnice,
					new OpenLayers.Size(0, 0),
					text,
					false
				);

				stitok.autoSize = true;
				stitok.minSize = new OpenLayers.Size(10, 10);
				stitok.maxSize = new OpenLayers.Size(100, 500);
				stitok.setBackgroundColor("#FFF79F");
				stitok.setOpacity(0.8);
				stitok.setBorder("2px solid white");

				olMapa.map.addPopup(stitok);
				olMapa.stitky.push(stitok);
			}

			// zaznam kvoli tlaci
			var novy_text = suradnice.lon + ':' + suradnice.lat + ':' + text;
			var body = $('#form_body');
			var stary_text = body.val();
			if(stary_text == ''){
				body.val(novy_text);
			} else {
				body.val(stary_text + '^^' + novy_text);
			}
		}
	},
	kresli_tlacoveWKT: function(wkt){
		var meno = 'olPrintBBox';

		var styl = OpenLayers.Util.applyDefaults({
				strokeWidth: 2,
				strokeColor: "#FF0000",
				fillColor: "#FFFFFF",
				fillOpacity: 0.2
			}, OpenLayers.Feature.Vector.style['default']);

		if(olMapa.vrstvy[meno] != undefined){
			olMapa.map.removeLayer(olMapa.vrstvy[meno]);
		}
		olMapa.vrstvy[meno] = new OpenLayers.Layer.Vector(meno,{style:styl});
		olMapa.map.addLayer(olMapa.vrstvy[meno]);

		var parser = new OpenLayers.Format.WKT();
		var feature = parser.read(wkt);
		olMapa.vrstvy[meno].addFeatures([feature]);
	},
	highlight_layer: null,
	kresliWKT: function(res, zl){
		if (res.geom != '' && res.bbox != ''){
		var meno = 'olHightlite';

		OpenLayers.Feature.Vector.style['default'].pointRadius = 25;
		var styl = OpenLayers.Util.applyDefaults({
				strokeWidth: 4,
				strokeColor: "#3DD4C2",
				strokeOpacity: 0.5,
				fillOpacity: 0.2
			}, OpenLayers.Feature.Vector.style['default']);

		if(this.highlight_layer) this.map.removeLayer(this.highlight_layer);
		this.highlight_layer = new OpenLayers.Layer.Vector("highlight", {style: styl});
		this.map.addLayer(this.highlight_layer);

		var parser = new OpenLayers.Format.WKT();
		var feature = parser.read(res.geom);

		ideal_zoom = this.map.getZoomForExtent((new OpenLayers.Bounds(res.bbox.left, res.bbox.down, res.bbox.right, res.bbox.up)), true);
		if(zl.zoom_level <= ideal_zoom){
			this.map.setCenter(new OpenLayers.LonLat(res.bbox.left + ((res.bbox.right - res.bbox.left) / 2), res.bbox.down + ((res.bbox.up - res.bbox.down) / 2)), zl.zoom_level);
		} else {
			this.map.setCenter(new OpenLayers.LonLat(res.bbox.left + ((res.bbox.right - res.bbox.left) / 2), res.bbox.down + ((res.bbox.up - res.bbox.down) / 2)), ideal_zoom);
		}
		this.highlight_layer.addFeatures([feature]);
		}
		OpenLayers.Feature.Vector.style['default'].pointRadius = 6;
	}
};

