	/**
	 * From waypoint_maker.js by Dot
	 * Converting Google's points into Human Readable form
	 */
	function ConvertPointToHR(degr, plus_spin, minus_spin)
	{
	    var absol = 0;
	    var deg = 0;
	    var mi = 0;
	    var sec = 0;
	    var spin = '';

	    if(degr < 0) spin = minus_spin; else spin = plus_spin;

	    absol=Math.abs(degr);
	    deg=Math.floor(absol);
	    mi=Math.floor((absol-deg)*60);
	    sec=Math.round((((absol-deg)*60)-mi)*6000)/100;
	    return (deg+'&deg; '+mi+'\' '+sec+'" '+spin);
	}
	
	/**
	 * Creating marker
	 */
	function createMarker(point, wep, mac, ssid, type, maxrssi, minrssi, channel, firstseen, lastseen)
	{
		var HRPoint = ConvertPointToHR(point.lat(), 'N', 'S') +', ' + ConvertPointToHR(point.lng(), 'E', 'W');		
		type = (type == 'AP') ? 'Access Point' : 'Ad hoc';
		
		wepimg = (wep == 'On') ? '<br /><img src="img/Lock16.png" alt="WEP On" title="WEP or WPA encryption is active in this network" />' : '';
		var GeneralContent = "<strong>" + ssid + "</strong><br />" + HRPoint + "<br />" + type + "<br />First seen: " + firstseen + wepimg;
		var NetworkContent = "<dl><dt>Maximal RSSI</dt><dd>" + maxrssi + "</dd><dt>Minimal RSSI</dt><dd>" + minrssi + "</dd>"
							+ "<dt>Channel</dt><dd>" + channel + "</dd><dt>WEP/WPA</dt><dd>" + wep + '</dd></dl>';
		
		var infoTabs = [
			new GInfoWindowTab("General", GeneralContent),
			new GInfoWindowTab("Network info", NetworkContent)			
		];

		var marker = new GMarker(point, {draggable: true});
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowTabsHtml(infoTabs);
		});
		
		GEvent.addListener(marker, "dragstart", function() {
			map.closeInfoWindow();
		});
		
		GEvent.addListener(marker, "dblclick", function() {
			map.closeInfoWindow();
			map.removeOverlay(marker);
		});

		return marker;
	}

	/**
	 * Loading map and centering on my area ;-)
	 */
	function createMap()
	{
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GMapTypeControl());
		map.addControl(new GLargeMapControl());

        map.setCenter(new GLatLng(51.2731916666667, 22.5475216666667), 13);
	}
	
	function addPoint(lat, lon, wep, mac, ssid, type, maxrssi, minrssi, channel, firstseen, lastseen)
	{
		map.addOverlay(createMarker(new GLatLng(lat, lon), wep, mac, ssid, type, maxrssi, minrssi, channel, firstseen, lastseen));
	}
	
	/**
	 * Testing GoogleMaps compatility
	 */
    function load()
	{
		if (GBrowserIsCompatible())
		{
			createMap();
		}
		else
		{
			alert("Sorry, your browser seems not to be compatible with Google Maps, and it is required to use this service.");
		}
	
    }
	
	function addEvent(obj, type, fn)
	{
		if (obj.addEventListener)
			obj.addEventListener(type, fn, false);
		else if (obj.attachEvent)
		{
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() {obj["e"+type+fn](window.event); }
			obj.attachEvent("on"+type, obj[type+fn]);
		}
	}

	/**
	 * Initializing XML DOM parser
	 * Should be tested, it works on Mozilla, but what with IE, Opera and KHTML?
	 */
	function parseXML(xml)
	{
		if (window.ActiveXObject)
		{
			var Doc = new ActiveXObject('Microsoft.XMLDOM');
			Doc.async = false;
			Doc.loadXML(xml);			
			return Doc;
		}
		else
		{			
			return (new DOMParser()) . parseFromString(xml, 'application/xml');
		}
	}

	/**
	 * Showing xml parsing error in proper div ;-)
	 */
	function xmlError(e)
	{
		$('error').innerHTML = '<p><img src="img/Error24.png" alt="" /> Error parsing XML file:' + e + '</p>';
	}

	/**
	 * Showing Ajax error in proper div ;-)
	 */
	function showError(originalRequest)
	{
		$('error').innerHTML = '<p><img src="img/Error24.png" alt="" /> Error processing request.</p>';
	}

	/**
	 * XML parsing and inserting points onto map
	 */
	function parseMap(orgReq)
	{		
		load();		
		var wepCount = 0, hiddenCount = 0, ignoredCount = 0;
		var xmlDoc = parseXML(orgReq.responseText);
		var root = xmlDoc.getElementsByTagName('DataSet1')[0];
				
		var aps = root.getElementsByTagName('AP');

		for (var i = 0; i < aps.length; i++)
		{				
			var ap = aps[i].childNodes;
			//if ((ap[23].childNodes[0].nodeValue == '0') && (op[25].childNodes[0].nodeValue == '0'))
			//	ignoredCount++;
			//		alert('gere');

			if (ap[1].childNodes[0].nodeValue == "On")
				wepCount++;
			
			if (!ap[5].hasChildNodes())
				hiddenCount++;
			
			addPoint(
						ap[23].childNodes[0].nodeValue.replace(',', '.'), // Lat
						ap[25].childNodes[0].nodeValue.replace(',', '.'), // Lon
						ap[1].childNodes[0].nodeValue, // Wep
						ap[3].childNodes[0].nodeValue, // Mac
						(ap[5].hasChildNodes())? ap[5].childNodes[0].nodeValue : "Hidden SSID", // SSID
						ap[7].childNodes[0].nodeValue, // Type
						ap[11].childNodes[0].nodeValue, // RSSI
						ap[13].childNodes[0].nodeValue, // RSSI
						ap[15].childNodes[0].nodeValue, // Channel
						ap[17].childNodes[0].nodeValue, // FirstSeen
						ap[19].childNodes[0].nodeValue // LastSeen
					);
		}
		var hiddenCountText = (hiddenCount > 1)? ' are' : ' is';
		$('stats').innerHTML = '<p>' + aps.length + ' networks found, ' + wepCount + ' with encryption (' + Math.round(wepCount / aps.length * 100) + '%), ' + hiddenCount +  hiddenCountText + ' hiding SSID</p>';

		if (ignoredCount > 0)
		{
			$('error').innerHTML = '<p><img src="img/Warning24.png" alt="" /> ' + ignoredCount + ' networks are on wrong position, as latitude and longitude equals 0 which is symptom of GPS localization error.</p>';
		}
	}

	/**
	 * Getting XML from server by Ajax request
	 */
	function loadXMLFile(evt)
	{		
		var myAjax = new Ajax.Request(
				Event.element(evt), 
				{
					method: 'get', 				
					onFailure: showError,
					onSuccess: parseMap			
				});
				
		return false;
	}
	
	function bindEvents(evt)
	{
		var mapsHrefs = $('maps').getElementsByTagName('a');
		for (var i = 0; i < mapsHrefs.length; i++)
		{
			mapsHrefs[i].onclick = this.loadXMLFile.bindAsEventListener(mapsHrefs[i]);
		}
		
		// showing error message for Internet Explorer
		if (window.ActiveXObject)
			$('error').innerHTML = '<p><img src="img/Error24.png" alt="" /> We are sorry, but Internet Explorer is not supported yet.</p>';
	}
	
	var map;
	window.onload = this.bindEvents.bindAsEventListener(this);	