var mapa;
var xml;
var dojazd;
var xmlname = 'mapdata.xml?'+Math.random();
var kategorie = new Array();
var obiekty = new Array();
var zaladowane_markery = new Array();
var menubars = new Array("search", "menu", "layer", "wskazowki", "odleglosc");
var warstwy = new Array();
var zaladowane_warstwy = new Array();
var xmlhttp = false;

var center_lat;
var center_lon;
var start_zoom;

var distance;
var gpscoord;

function load() {
	if (GBrowserIsCompatible()) {
		GDownloadUrl(xmlname, function(dane,kodOdpowiedzi)
		{
			if(kodOdpowiedzi==200)
			{
				xml = GXml.parse(dane);
				var settings = xml.documentElement.getElementsByTagName('mapsettings');
				center_lat = parseFloat(settings[0].getAttribute("center_lat"));
				center_lon = parseFloat(settings[0].getAttribute("center_lon"));
				start_zoom = parseInt(settings[0].getAttribute("start_zoom"));
				mapa = new GMap2(document.getElementById("mapa"));
       			mapa.setCenter(new GLatLng(center_lat,center_lon), start_zoom);
				mapa.addControl(new GLargeMapControl());
				mapa.addControl(new GMapTypeControl());
				//mapa.addMapType(G_PHYSICAL_MAP);
				dojazd = new GDirections(mapa, document.getElementById("routetext"));
				GEvent.addListener(dojazd, "error", function()
				{
					var blad = tekstBledu(dojazd.getStatus().code);
					document.getElementById("routetext").innerHTML += '<p>Błąd '+dojazd.getStatus().code+': '+blad+'</p>';
				});
				GEvent.addListener(mapa,"zoomend", function()
				{
					zoomLayers(mapa.getZoom());
   				}); 
				
				loadCategories();
				makeCategoryMenu();
				loadObjects();
				viewInitialMarkers();
				loadLayers();
				makeLayersBar();
				viewInitialLayers();
				GEvent.trigger(mapa,'zoomend');
				
				initMenuBars();
				
			}
			else
			{
				alert('Nie można załadować pliku z danymi');
			}
		});
	}
}

function zoomLayers(newLevel) {
	for(var i=0; i<warstwy.length; i++) {
		if (newLevel < warstwy[i].minzoom) {
			hidePolys(warstwy[i].lid);
		} else if (newLevel >= warstwy[i].minzoom) {
			showPolys(warstwy[i].lid);
		}
	}
}

function hidePolys(lid) {
	if (typeof(zaladowane_warstwy[lid]) == 'undefined') return;
	
	for (var i in zaladowane_warstwy[lid]) {
		if (!zaladowane_warstwy[lid][i].isHidden()) zaladowane_warstwy[lid][i].hide();
	}
}

function showPolys(lid) {
	if (typeof(zaladowane_warstwy[lid]) == 'undefined') return;
	
	for (var i in zaladowane_warstwy[lid]) {
		if (zaladowane_warstwy[lid][i].isHidden()) zaladowane_warstwy[lid][i].show();
	}
}

function loadLayers() {
	warstwy_xml = xml.documentElement.getElementsByTagName('maplayer');
	
	for(var i=0; i<warstwy_xml.length; i++) {
		var warstwa = new Object();
		warstwa.lid = warstwy_xml[i].getAttribute("lid");
		warstwa.nazwa = warstwy_xml[i].getAttribute("nazwa");
		warstwa.loaddisp = warstwy_xml[i].getAttribute("loaddisp");
		warstwa.desc = decodeURIComponent(warstwy_xml[i].getAttribute("desc"));
		warstwa.sort = parseInt(warstwy_xml[i].getAttribute("sort"));
		warstwa.minzoom = parseInt(warstwy_xml[i].getAttribute("minzoom"));
		
		warstwy.push(warstwa);
	}
	warstwy_xml = undefined;
	warstwy.sort(function(a,b){return b.sort - a.sort});
}

function makeLayersBar() {
	var layer_html = new String();
	
	for(var i=0; i<warstwy.length; i++) {
		layer_html += '<div class="layerel"><input type="checkbox" name="lchk-'+warstwy[i].lid+'" id="lchk-'+warstwy[i].lid+'" onclick="showHideLayer('+"'"+warstwy[i].lid+"'"+')"/>'+warstwy[i].nazwa+'<div id="laydesc-'+warstwy[i].lid+'" style="display: none; margin-left: 15px;">'+warstwy[i].desc+'</div></div>';
	}
	document.getElementById('layer').innerHTML += layer_html;
}

function viewInitialLayers() {
	for(var i=0; i<warstwy.length; i++) {
		if (warstwy[i].loaddisp == '1') {
			addLayer(warstwy[i].lid);
		}
	}
}

function showHideLayer(lid) {
	if (document.getElementById('lchk-'+lid).checked) {
		addLayer(lid);
	} else {
		removeLayer(lid);
	}
}

function addLayer(lid) {
	//TODO - ew. dla bezpieczenstwa jesli juz sa jakies poli w zaladowane_warstwy[lid] to je usunac
	zaladowane_warstwy[lid] = new Array();
	
	var poli_xml = xml.documentElement.getElementsByTagName('polygon');
	for(var i=0; i<poli_xml.length; i++) {
		if (poli_xml[i].parentNode.getAttribute('lid') != lid) continue;
		var poli = addPolygon(poli_xml[i]);
		mapa.addOverlay(poli);
		zaladowane_warstwy[lid].push(poli);
	}
	
	var poli_xml = xml.documentElement.getElementsByTagName('polyline');
	for(var i=0; i<poli_xml.length; i++) {
		if (poli_xml[i].parentNode.getAttribute('lid') != lid) continue;
		var poli = addPolyline(poli_xml[i]);
		mapa.addOverlay(poli);
		zaladowane_warstwy[lid].push(poli);
	}
	document.getElementById('lchk-'+lid).checked = true;
	document.getElementById('laydesc-'+lid).style.display = 'block';
}

function removeLayer(lid) {
	if(typeof(zaladowane_warstwy[lid]) == 'undefined') return;
	
	for (var i in zaladowane_warstwy[lid]) {
		mapa.removeOverlay(zaladowane_warstwy[lid][i]);
	}
	zaladowane_warstwy[lid] = undefined;
	document.getElementById('lchk-'+lid).checked = false;
	document.getElementById('laydesc-'+lid).style.display = 'none';
}

function loadCategories() {
	kategorie_xml = xml.documentElement.getElementsByTagName('mapcategory');
	
	for(var i=0; i<kategorie_xml.length; i++) {
		var kategoria = new Object();
		kategoria.catid = kategorie_xml[i].getAttribute("catid");
		kategoria.nazwa = kategorie_xml[i].getAttribute("nazwa");
		kategoria.ikona = kategorie_xml[i].getAttribute("ikona");
		kategoria.sort = parseInt(kategorie_xml[i].getAttribute("sort"));
		//TODO - jesli bedzie obsluga podkategorii to tutaj pewnie pobrac catid nadrzednej
		
		kategorie.push(kategoria);
	}
	kategorie_xml = undefined;
	kategorie.sort(function(a,b){return b.sort - a.sort});
}

function loadObjects() {
	var obiekty_xml = xml.documentElement.getElementsByTagName('mapobject');
	
	for(var i=0; i<obiekty_xml.length; i++) {
		var obiekt = prepareObject(obiekty_xml[i]);
		obiekty.push(obiekt);
	}
	obiekty_xml = undefined;
	obiekty.sort(function(a,b){return parseInt(b.sort) - parseInt(a.sort)});
	
	for(var i=0; i<obiekty.length; i++) {
		objectToMenu(obiekty[i]);
	}
}

function viewCategoryMarkers(cid) {
	removeLoadedMarkers();
	
	for(var i=0; i<obiekty.length; i++) {
		if (obiekty[i].categoryid != cid) continue;
		marker = makeMarker(obiekty[i]);
		mapa.addOverlay(marker);
		zaladowane_markery[obiekty[i].oid] = marker;
	}
	
	for(var k=0; k<kategorie.length; k++) {	
		if (kategorie[k].catid == cid) {
			document.getElementById('catdiv-'+kategorie[k].catid).style.display = "block";
		} else {
			if (document.getElementById('catdiv-'+kategorie[k].catid)) {
				document.getElementById('catdiv-'+kategorie[k].catid).style.display = "none";
			}
		}
	}
	document.getElementById('searchresult').innerHTML='';
}

function removeLoadedMarkers() {
	for (var j in zaladowane_markery) {
		mapa.removeOverlay(zaladowane_markery[j]);
	}
	zaladowane_markery = new Array();
}

function viewInitialMarkers() {
	removeLoadedMarkers();
	
	for(var i=0; i<obiekty.length; i++) {
		if (obiekty[i].loaddisp != "1") continue;
		marker = makeMarker(obiekty[i]);
		mapa.addOverlay(marker);
		zaladowane_markery[obiekty[i].oid] = marker;
	}
}

function objectToMenu(object) {
	var cati = object.categoryid;
	var oid = object.oid;
	var nazwa = object.nazwa;
	document.getElementById('catdiv-'+cati).innerHTML += "<div class=\"menuobj\"><a href=\"javascript:void(0)\" onclick=\"triggerMarker('"+oid+"')\">"+nazwa+'</a></div>';
}

function triggerMarker(oid) {
	GEvent.trigger(zaladowane_markery[oid], "click");
}

function makeCategoryMenu() {
	var menu_html = new String();
	
	for(var i=0; i<kategorie.length; i++) {
		menu_html = menu_html + '<div class="menuel"><img class="menuico" src="images/folder.png"><a class="menua" href="javascript:void(0)" onclick="viewCategoryMarkers('+"'"+kategorie[i].catid+"'"+')">'+kategorie[i].nazwa+'</a></div><div class="menuinner" id="catdiv-'+kategorie[i].catid+'"></div>';
	}
	document.getElementById('menu').innerHTML = menu_html;
}

function initMenuBars() {
	for (var i in menubars) {
		if(typeof(document.getElementById(menubars[i])) == 'undefined') continue;
		
		if(menubars[i] == 'menu') {
			showMenuBar(menubars[i]);
		} else {
			hideMenuBar(menubars[i]);
		}
	}
}

function showHideMenuBar(barid, forced_display) {
	if(typeof(document.getElementById(barid)) == 'undefined') return;
	
	if (document.getElementById(barid).style.display == 'none' || forced_display) {
		showMenuBar(barid);
		for (var i in menubars) {
			if(menubars[i] != barid) hideMenuBar(menubars[i]);
		}
	} else {
		hideMenuBar(barid);
	}
}

function showMenuBar(barid) {
	document.getElementById(barid).style.display = 'block';
	document.getElementById('rollon-'+barid).innerHTML = '-';
}

function hideMenuBar(barid) {
	document.getElementById(barid).style.display = 'none';
	document.getElementById('rollon-'+barid).innerHTML = '+';
}

function search() {
	ajaxInit();
	xmlhttp.open("GET","mapsearch.php?sq="+encodeURI(document.getElementById('searchkey').value),true);
	xmlhttp.send(null);
}

function ajaxInit()
{
	if (window.XMLHttpRequest)
  	{
 	 // code for IE7+, Firefox, Chrome, Opera, Safari
  	xmlhttp=new XMLHttpRequest();
  	}
	else if (window.ActiveXObject)
  	{
  	// code for IE6, IE5
  	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 	}
 	
 	xmlhttp.onreadystatechange=function()
	{
		if(xmlhttp.readyState==4) {
			var xmlDoc = xmlhttp.responseXML;
			var searcherror = xmlDoc.getElementsByTagName("searcherror");
			if (searcherror[0]) {
				document.getElementById('searchresult').innerHTML='<div class="searcherror">'+searcherror[0].childNodes[0].nodeValue+'</div>';
			} else {
				var searchobj = xmlDoc.getElementsByTagName("mapobject");
				if (typeof(searchobj[0]) != 'undefined') {
					removeLoadedMarkers();
					
					for(var k=0; k<kategorie.length; k++) {	
						if (document.getElementById('catdiv-'+kategorie[k].catid)) {
							document.getElementById('catdiv-'+kategorie[k].catid).style.display = "none";
						}
					}
					
					if (searchobj.length == 0) {
						document.getElementById('searchresult').innerHTML='<div class="searchok">Nie znaleziono żadnych obiektów</div>';
					} else if (searchobj.length == 1) {
						document.getElementById('searchresult').innerHTML='<div class="searchok">'+'Znaleziono <b>1</b> obiekt'+'</div>';
					} else if (searchobj.length > 1 && searchobj.length < 5) {
						document.getElementById('searchresult').innerHTML='<div class="searchok">'+'Znaleziono <b>'+searchobj.length+'</b> obiekty'+'</div>';
					} else {
						document.getElementById('searchresult').innerHTML='<div class="searchok">'+'Znaleziono <b>'+searchobj.length+'</b> obiektów'+'</div>';
					}
					
					for (var i=0; i<searchobj.length; i++) {
						var obiekt = prepareObject(searchobj[i]);
						document.getElementById('searchresult').innerHTML += "<div class=\"searchobj\"><a href=\"javascript:void(0)\" onclick=\"triggerMarker('"+obiekt.oid+"')\">"+obiekt.nazwa+'</a></div>';
						marker = makeMarker(obiekt);
						mapa.addOverlay(marker);
						zaladowane_markery[obiekt.oid] = marker;
					}
				} else {
					document.getElementById('searchresult').innerHTML='<div class="searchok">Nie znaleziono żadnych obiektów</div>';
				}
			}
  		}
	}
}

function showRouteForm() {
	document.getElementById('trasform').style.display = "block";
	document.getElementById('traslink').style.display = "none";
	mapa.updateInfoWindow();
}
function hideRouteForm() {
	document.getElementById('trasform').style.display = "none";
	document.getElementById('traslink').style.display = "block";
	mapa.updateInfoWindow();
}

function findRoute(adres2) {
	showHideMenuBar('wskazowki', true);
	var adres1 = document.getElementById('addrpocz').value;
	dojazd.load('from:'+adres1+' to:'+adres2, {locale: 'pl_PL'});
	mapa.closeInfoWindow();
	document.getElementById("routemenu").innerHTML = '<div id="zamknijDojazd"><a href="javascript: closeRoute();">« Zamknij</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript: printRoute();">« Drukuj</a></div>';
	document.getElementById('routetext').style.display = "block";
}

function closeRoute() {
	dojazd.clear();
	mapa.setCenter(new GLatLng(center_lat,center_lon), start_zoom);
	document.getElementById("routemenu").innerHTML = '';
}

function printRoute() {
	mywindow = window.open ("", "mywindow", "location=0,status=1,scrollbars=1,width=400,height=600");
	mywindow.document.write(document.getElementById("routetext").innerHTML);
	mywindow.print();
}

function startDistance() {
	document.getElementById("akt-distance").style.display = 'block';
	document.getElementById("akt-distance-val").innerHTML = '0';
	var sarr = new Array();
	distance = new GPolyline(sarr,"#00f", 3, .8);	
	mapa.addOverlay(distance);
	distance.enableDrawing();
	document.getElementById("distance").diststart.disabled=true;
	distance.editlistener = GEvent.addListener(distance, 'lineupdated', function() {
		var dist = this.getLength();
		dist = Math.round(dist);
		document.getElementById("akt-distance-val").innerHTML = dist;
	});
}

function endDistance() {
	document.getElementById("distance").diststart.disabled=false;
	document.getElementById("akt-distance").style.display = 'none';
	mapa.removeOverlay(distance);
	distance = null;
}
