//FIRST, TELL THE BROWSERS TO REACT TO THE EVENT
//http://www.howtocreate.co.uk/tutorials/index.php?tut=0&part=17
if( document.captureEvents ) {
    //non IE
    if( Event.KEYUP ) {
        //NS 4, NS 6+, Mozilla 0.9+
        document.captureEvents( Event.KEYUP );
    }
}
/* this next line tells the browser to detect a keyup
event over the whole document and when it detects it,
it should run the event handler function 'alertkey' */
document.onkeyup = function (e) {
    if( !e ) {
        //if the browser did not pass the event information to the
        //function, we will have to obtain it from the event register
        if( window.event ) {
            //DOM
            e = window.event;
        } else {
            //TOTAL FAILURE, WE HAVE NO WAY OF REFERENCING THE EVENT
            return;
        }
    }
    if( typeof( e.which ) == 'number' ) {
        //NS 4, NS 6+, Mozilla 0.9+, Opera
        e = e.which;
    } else if( typeof( e.keyCode ) == 'number'  ) {
        //IE, NS 6+, Mozilla 0.9+
        e = e.keyCode;
    } else if( typeof( e.charCode ) == 'number'  ) {
        //also NS 6+, Mozilla 0.9+
        e = e.charCode;
    } else {
        //TOTAL FAILURE, WE HAVE NO WAY OF OBTAINING THE KEY CODE
        return;
    }
    //window.alert('The key pressed has keycode ' + e + ' and is key ' + String.fromCharCode( e ) );
}




















GMap.prototype.gLargeMapControl = null;
GMap.prototype.gSmallMapControl = null;
GMap.prototype.gSmallZoomControl = null;
GMap.prototype.gMapTypeControl = null;


function initMap (start_long, start_lat, start_zoom, start_map_type, c_glmc, c_gsmc, c_gszc, c_gmtc, left_top, right_bottom)
{
	// general map initialisation

	// creating  controls but not yet adding them to the map
	map.gLargeMapControl = new GLargeMapControl();
	map.gSmallMapControl = new GSmallMapControl();
	map.gSmallZoomControl = new GSmallZoomControl();
	map.gMapTypeControl = new GMapTypeControl();
	
	// add some controls
	if (c_glmc == 1){ map.addControl(map.gLargeMapControl) };
	if (c_gsmc == 1){ map.addControl(map.gSmallMapControl) };
	if (c_gszc == 1){ map.addControl(map.gSmallZoomControl) };
	if (c_gmtc == 1){ map.addControl(map.gMapTypeControl) };

	// maptypes are saved as an integer and not as one of these non-working constans
	if (start_map_type < map.getMapTypes().length) {
		map.setMapType(map.getMapTypes()[start_map_type]);
	}
	
	map.registerKeyHandlers( window ); 

	if (start_zoom == 'auto')
		start_zoom = map.getZoomFromPoints(left_top, right_bottom);

	// go to starting point
	map.centerAndZoom(new GPoint(start_long, start_lat), start_zoom);
}


// is set to 1 if a refresh of the "bubbles" is needed, i.e. when the user dragged or zoomed
GMap.prototype.waiting = 0;
// 1, if script is waiting for xml-response
GMap.prototype.busy = 0;
// global array which contains the coordinates of all markers on the map
GMap.prototype.overlayList = new Array();
// place for some config values needed - this is a temporary solution
GMap.prototype.atlasConfig = new Array('hallo');


// this function checks, if there is a marker at a certain point at the map
GMap.prototype.isMarker = function (point)
{
	var found = false;
	for (var i=0;i<this.overlayList.length;i++) {
		if (this.overlayList[i].x == point.x && this.overlayList[i].y == point.y) {found = true; break;}
	}
	return found;
}


// this function is to create a marker with the required attributes
GMap.prototype.createMarker = function (point, infohtml) {
	var marker = new GMarker(point);

	GEvent.addListener(marker, "click", function() {
	marker.openInfoWindowHtml(infohtml);
	});

	return marker;
}


// workaround the buggy MapType implementation (see http://groups-beta.google.com/group/Google-Maps-API/browse_thread/thread/2be31ffce3d7aec8/08963d4abe8e13b7)
GMap.prototype.getCurrentMapTypeNumber = function () {
	var type=-1;
	for(var ix=0;ix<this.getMapTypes().length;ix++)
	{
		if(this.getMapTypes()[ix]==this.getCurrentMapType())
			type=ix;
	}
	return type;
}

// see http://groups-beta.google.com/group/Google-Maps-API/browse_thread/thread/7d6b450fa6893a9c/3197341a7c5facdf?q=Lokkju&rnum=9&hl=en#3197341a7c5facdf for information about this function
GMap.prototype.getZoomFromPoints = function (p1,p2)
{
	var z = 0;
	var d = new GSize(0,0);
	d.width=Math.abs(p2.x-p1.x);
	d.height=Math.abs(p2.y-p1.y);
	for (z=0;z<17;z++) {
		var b = this.spec.getLatLng(this.centerBitmap.x - this.viewSize.width * this.centerScreen.x,  this.centerBitmap.y - this.viewSize.height * this.centerScreen.y, z);
		var c = this.spec.getLatLng(this.centerBitmap.x + this.viewSize.width *(1 - this.centerScreen.x), this.centerBitmap.y + this.viewSize.height * (1 - this.centerScreen.y), z);
		var a = new GSize(0,0);
		a.width=Math.abs(c.x-b.x);
		a.height=Math.abs(c.y-b.y);
		if (d.width < a.width || d.height < a.height) {break;}
	}
	z=z+1;
	return z;
}


GPoint.prototype.x2sec = function () {
	var plus=Math.abs(this.x);
	var degr=Math.floor(plus);
	var minu=Math.floor(60*(plus-degr));
	var sec=Math.floor(60*(60*(plus-degr)-minu));
	var compass="?"
	if (minu<10) {minu="0"+minu};
	if (sec<10) {sec="0"+sec};
	if (this.x<0) {compass="W"} else {compass="E"}
	return ""+degr+"&deg; "+minu+"' "+sec+'" '+compass;
}

GPoint.prototype.y2sec = function () {
	var plus=Math.abs(this.y);
	var degr=Math.floor(plus);
	var minu=Math.floor(60*(plus-degr));
	var sec=Math.floor(60*(60*(plus-degr)-minu));
	var compass="?"
	if (minu<10) {minu="0"+minu};
	if (sec<10) {sec="0"+sec};
	if (this.y<0) {compass="S"} else {compass="N"}
	return ""+degr+"&deg; "+minu+"' "+sec+'" '+compass;
}



GMap.prototype.prepareForFindCoords = function (l_long, l_lat, l_choose_this)
{
	// for "find coordinates"
	GEvent.addListener(map, 'click', function(overlay, point) {
		if (point)
		{
			map.clearOverlays();
			var loc = new GMarker(point);
			map.addOverlay(loc);
			map.recenterOrPanToLatLng(point);
			loc.openInfoWindowHtml('<span class="gen" style="white-space: nowrap;">' + l_long + ': ' + point.x2sec() + '<br />' + l_lat + ': ' + point.y2sec() + '<br /><a href="javascript:void(0)" onclick="setThisAsMyLocation(' + point.x + ', ' + point.y + ', ' + map.getZoomLevel() + ', ' + map.getCurrentMapTypeNumber() + ')">' + l_choose_this + '</a></span>');
			map.recenterOrPanToLatLng(point);
		}
	});
	GEvent.addListener(map, 'zoom', function(oldZoomLevel, newZoomLevel) {
		if (newZoomLevel) {
			document.getElementById('zoom').value = newZoomLevel;
		}
	});
	GEvent.addListener(map, 'maptypechanged', function() {
		document.getElementById('maptype').value = this.getCurrentMapTypeNumber();
	});
}



GMap.prototype.prepareForViewMap = function ()
{
	// when the usercoordinates are displayed
	var bounds = map.getBoundsLatLng();
	putUsersIntoMap(bounds);
	GEvent.addListener(map, 'zoom', function (oldZoomLevel, newZoomLevel) {
		overlayList = new Array();
		map.waiting = 1;
	});
	GEvent.addListener(map, 'moveend', function () {
		map.waiting = 1;
	});

	loop = window.setInterval("start()", 500);
}

GMap.prototype.prepareForShowDistance = function (p_id, p_long, p_lat, p_username)
{
    if (parseFloat(p_id))
    {
        point1 = new GPoint(parseFloat(p_long), parseFloat(p_lat));
        var marker1 = map.createMarker(point1, '<a href="' + U_PROFILE_G + '&u=' + p_id + '" class="gen">' + p_username + '</a>');
        map.addOverlay(marker1);

        point2 = new GPoint(parseFloat(LONGITUDE), parseFloat(LATITUDE));
        var marker2 = map.createMarker(point2, '<span class="gen">' + L_YOUR_LOCATION + '</span>');
        map.addOverlay(marker2);
		  
			var polyline = new GPolyline([point1, point2], "#ff0000", 3);
map.addOverlay(polyline);		  

        centerLong = point1.x + (point2.x - point1.x) / 2;
        centerLat = point1.y + (point2.y - point1.y) / 2;
        map.centerAndZoom(new GPoint(centerLong, centerLat), map.getZoomFromPoints(point1, point2));
    }
}

GMap.prototype.prepareForAdminPanel = function ()
{
	map.prepareForViewMap();
	map.disableInfoWindow();
	window.clearInterval(loop);
	GEvent.addListener(map, 'maptypechanged', function () {
		document.getElementById('atlas_start_mode').value = map.getCurrentMapTypeNumber();
	});
	GEvent.addListener(map, 'zoom', function (oldZ, newZ) {
		document.getElementById('atlas_zoom').value = newZ;
	});
	GEvent.addListener(map, 'moveend', function () {
		var center = map.getCenterLatLng();
		document.getElementById('atlas_start_long').value = center.x;
		document.getElementById('atlas_start_lat').value = center.y;
	});
}



function start ()
{
	if (map.busy == 0 && map.waiting == 1) putUsersIntoMap();
}

function putUsersIntoMap ()
{
	map.busy = 1;
	map.waiting = 0;
	var bounds = map.getBoundsLatLng();
	var mapWidth = bounds.maxX - bounds.minX;
	var mapHeight = bounds.maxY - bounds.minX;
	request = GXmlHttp.create();
	request.open('GET', U_XML_ADRESS + "&minx=" + (bounds.minX - 0.5 * mapWidth) + "&miny=" + (bounds.minY - 0.5 * mapHeight) + "&maxx=" + (bounds.maxX + 0.5 * mapWidth) + "&maxy=" + (bounds.maxY + 0.5 * mapHeight), true);
	request.onreadystatechange = function ()
		{
			if (request.readyState == 4)
			{
				xmlDoc = request.responseXML;
				var markers = xmlDoc.documentElement.getElementsByTagName("m");
				for (var i=0;i<markers.length;i++)
				{
					var point = new GPoint(parseFloat(markers[i].getAttribute("lng")),  parseFloat(markers[i].getAttribute("ltd")));
					if (map.isMarker(point)) var IsM = 1; else var IsM = 0;
					var infohtml = '';

					for (var j=0;j<markers[i].childNodes.length;j++)
					{
						if (markers[i].childNodes[j].nodeName.toLowerCase() == "u")
						{
							var username = markers[i].childNodes[j].firstChild.nodeValue;
							var userid = markers[i].childNodes[j].getAttribute("id");
							var distance = markers[i].childNodes[j].getAttribute("dist");
							distance = (distance == '') ? '' : distance + " km";
							var userlink = document.createElement("a");
							userlink.setAttribute("href", U_PROFILE_G + '&u=' + userid);
							userlink.appendChild(document.createTextNode(username));

							if (IsM == 0)
							{
								infohtml = infohtml + "<br />";
								infohtml = infohtml + '<a href="' + U_PROFILE_G + '&u=' + userid + '" class="gen">' + username + '</a>';
							}
						}
					} // each user

					if (IsM == 0)
					{
						var marker = map.createMarker(point, infohtml);
						map.addOverlay(marker);
						map.overlayList.push(point);
					}
				} // each marker

				map.busy = 0;

			} // end if status = 4
		} // end function

	request.send(null);
}


// copies the coordinates into the parent window
function setThisAsMyLocation(slong, slat, szoom, stype)
{
	if (opener.document.getElementById('user_long')) {opener.document.getElementById('user_long').value = slong;}
	if (opener.document.getElementById('user_lat')) {opener.document.getElementById('user_lat').value = slat;}
	opener.focus();
	window.close();
	return true;
}
