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]);
	//}

	new GKeyboardHandler(map,window);
	
	map.enableContinuousZoom();

	if (start_zoom == 'auto'){
	
		start_zoom = map.getZoomFromPoints(left_top, right_bottom);
		//start_zoom=13;
	} 
	
	//alert(start_zoom);
	
	start_zoom = parseFloat(start_zoom);
	
	// go to starting point
	//map.centerAndZoom(new GLatLng(start_long, start_lat), 17-start_zoom);
	map.setCenter(new GLatLng(start_lat, start_long), start_zoom);
	
	//alert(G_NORMAL_MAP);
	
}
// is set to 1 if a refresh of the "bubbles" is needed, i.e. when the user dragged or zoomed
GMap2.prototype.waiting = 0;
// 1, if script is waiting for xml-response
GMap2.prototype.busy = 0;
// global array which contains the coordinates of all markers on the map
GMap2.prototype.overlayList = new Array();
// place for some config values needed - this is a temporary solution
GMap2.prototype.atlasConfig = new Array('hallo');
// this function checks, if there is a marker at a certain point at the map
GMap2.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
GMap2.prototype.createMarker = function (point, infohtml, iconloc, poidot) {

	var icon = new GIcon();
	
	if(iconloc!='blank' && iconloc!=''){
	
		icon.image = "../images/veh/" + iconloc + ".gif";
		
		if(iconloc!='aegean_blue'){
		
			icon.iconSize = new GSize(32, 16);
			icon.shadowSize = new GSize(32, 16);
		
		} else {
		
			icon.iconSize = new GSize(22, 16);
			icon.shadowSize = new GSize(22, 16);
		}
			
		icon.shadow = "../images/veh_shadow.png";
		icon.iconAnchor = new GPoint(16, 8);
		icon.infoWindowAnchor = new GPoint(18, 1);
		
	} else {
	
		icon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png"; 
		icon.iconSize = new GSize(12, 20);
		icon.shadowSize = new GSize(22, 20);
		
		icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		icon.iconAnchor = new GPoint(6, 20);
		icon.infoWindowAnchor = new GPoint(5, 1);
		
	
	}
	
	if(poidot==1){
	
		icon.shadow = '';
		icon.iconSize = new GSize(8,8);
		icon.iconAnchor = new GPoint(4,4);
		icon.infoWindowAnchor = new GPoint(4,4);
		
	}
	
	var marker = new GMarker(point, icon); 

	GEvent.addListener(marker, "click", function() {
	marker.openInfoWindowHtml(infohtml);
	});

	return marker;
}
GMap2.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;
}

GMap2.prototype.getZoomFromPoints = function (p1,p2)
{

	//var n=0;s=0;e=0;w=0;
	
	//n=Math.max(p1.lat(),p2.lat());
	//e=Math.max(p1.lng(),p2.lng());
	//s=Math.min(p1.lat(),p2.lat());
	//w=Math.min(p1.lng(),p2.lng());
	
	//ne = new GLatLng(e,n);
	//sw = new GLatLng(w,s);
	//map.setCenter(new GLatLng(0,0),0);
	
	var boundBox = new GLatLngBounds;
	
    boundBox.extend(p1);
    boundBox.extend(p2);

	map.setZoom(map.getBoundsZoomLevel(boundBox));
	
	var z = map.getBoundsZoomLevel(boundBox);
	
	//map.setCenter(boundBox.getCenter());
	
	/*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;*/
	
	//z = map.getBoundsZoomLevel(boundBox);

	return z;
}
GLatLng.prototype.x2sec = function () {
	var plus=Math.abs(this.lng());
	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.lng()<0) {compass="W"} else {compass="E"}
	
	return ""+degr+"&deg; "+minu+"' "+sec+'" '+compass;
}
GLatLng.prototype.y2sec = function () {
	var plus=Math.abs(this.lat());
	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.lat()<0) {compass="S"} else {compass="N"}
	
	return ""+degr+"&deg; "+minu+"' "+sec+'" '+compass;
}



GMap2.prototype.prepareForFindCoords = function (l_long, l_lat, l_choose_this)
{

	// for "find coordinates"
	GEvent.addListener(map, 'click', function(overlay, point) {
	
		map.overlayFindCoords(overlay, point, l_long, l_lat, l_choose_this);
	
	}
	);
	
	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();
	});
}

GMap2.prototype.overlayFindCoords = function(overlay, point,l_long, l_lat, l_choose_this) {
	
	if (point)
	{
		map.clearOverlays();

		var icon = new GIcon();	

		if(SHOW_ICON!='blank'){
		
			icon.image = "../images/veh/" + SHOW_ICON + ".gif";
			
			if(SHOW_ICON!='aegean_blue'){
			
				icon.iconSize = new GSize(32, 16);
				icon.shadowSize = new GSize(32, 16);
			
			} else {
			
				icon.iconSize = new GSize(22, 16);
				icon.shadowSize = new GSize(22, 16);
			}
				
			icon.shadow = "../images/veh_shadow.png";
			icon.iconAnchor = new GPoint(16, 8);
			icon.infoWindowAnchor = new GPoint(18, 1);
			
		} else {
		
			icon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png"; 
			icon.iconSize = new GSize(12, 20);
			icon.shadowSize = new GSize(22, 20);
			
			icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
			icon.iconAnchor = new GPoint(6, 20);
			icon.infoWindowAnchor = new GPoint(5, 1);
	

		}
		
		var loc = new GMarker(point, icon);
		
		var infohtml1 = '<span class="largetext" style="white-space: nowrap;">' + l_lat + ': ' + point.y2sec() + '<br />' + l_long + ': ' + point.x2sec() + '<br /><a href="javascript:void(0)" onclick="setThisAsMyLocation(' + point.x + ', ' + point.y + ', ' + map.getZoom() + ', ' + map.getCurrentMapTypeNumber() + ')">' + l_choose_this + '</a></span>';
		
		map.addOverlay(loc);
		map.panTo(point);
					
		loc.openInfoWindowHtml(infohtml1);
			
		map.panTo(point);
	}
}


GMap2.prototype.prepareForViewMap = function ()
{
	var bounds = map.getBounds();
	putUsersIntoMap(bounds);
	GEvent.addListener(map, 'zoomend', function (oldZoomLevel, newZoomLevel) {
		overlayList = new Array();
		map.waiting = 1;
	});
	GEvent.addListener(map, 'moveend', function () {
		map.waiting = 1;
	});

	loop = window.setInterval("start()", 500);
}

GMap2.prototype.prepareForShowDistance = function (p_id, p_long, p_lat, p_username, p_vehcolour, p_distance, my_username)
{
    if (parseFloat(p_id))
    {
        point1 = new GLatLng(parseFloat(p_lat), parseFloat(p_long));
        
        var infohtml1 = '<span class="mediumtext"><a href="' + U_PROFILE_G + '&u=' + p_id + '" class="gen">' + p_username + '</a><BR /><BR />'+p_distance + '<br /><a href="#" onclick="centerMapAndCloseBubble('+point1.lat()+', '+point1.lng()+');return false;">Centre map on ' + p_username + '</span>';
        
        //var marker1 = map.createMarker(point1, '<span class="mediumtext"><a href="' + U_PROFILE_G + '&u=' + p_id + '" class="gen">' + p_username + '</a><BR /><BR />'+p_distance+'</span>', p_vehcolour);
        
        var marker1 = map.createMarker(point1, infohtml1, p_vehcolour);
        map.addOverlay(marker1);

        point2 = new GLatLng(parseFloat(LATITUDE), parseFloat(LONGITUDE));
        
        var infohtml2 = '<span class="mediumtext">' + my_username + ' (This is you!)<BR /><BR /><a href="profile.php?mode=editprofile#mapcoords">Change your location</a><br /><a href="#" onclick="centerMapAndCloseBubble('+point2.lat()+', '+point2.lng()+');return false;">Centre map on you</span>';
        
        //var marker2 = map.createMarker(point2, '<span class="mediumtext">' + L_YOUR_LOCATION + '<BR/><BR/>'+ 'Longitude' + ': ' + point2.x2sec() + '<br />' + 'Latitude' + ': ' + point2.y2sec()+'</span>', SHOW_ICON);
        
        var marker2 = map.createMarker(point2, infohtml2, SHOW_ICON);
        
        map.addOverlay(marker2);

		var polyline = new GPolyline([point1, point2], "#ff6600", 4, 0.5);
		map.addOverlay(polyline);
		
		var centBound = new GLatLngBounds();
		
		centBound.extend(point1);
		centBound.extend(point2);
		
		var centPoint = new GLatLng();
		
		centPoint = centBound.getCenter();

        //centerLong = point1.lng() + (point2.lng() - point1.lng()) / 2;
        //centerLat = point1.lat() + (point2.lat() - point1.lat()) / 2;
        
        //map.getZoomFromPoints(point1,point2);
        
        //map.setZoom(map.getZoomFromPoints(point1, point2));
        
        //map.setCenter(new GLatLng(centerLat, centerLong), map.getZoomFromPoints(point1, point2));
        map.setCenter(centPoint, map.getZoomFromPoints(point1, point2));
        
    }
}

GMap2.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, 'zoomend', function (oldZoomLevel, newZoomLevel) {
		document.getElementById('atlas_zoom').value = newZoomLevel;
	});
	GEvent.addListener(map, 'moveend', function () {
		var center = map.getCenter();
		document.getElementById('atlas_start_long').value = center.lng();
		document.getElementById('atlas_start_lat').value = center.lat();
	});
}



function start ()
{
	if (map.busy == 0 && map.waiting == 1) putUsersIntoMap();
}

function centerMapAndCloseBubble (p_lat,p_lng)
{

	map.panTo(new GLatLng(p_lat,p_lng));
	var win = map.getInfoWindow()

	win.hide();

}

function putUsersIntoMap ()
{
	map.busy = 1;
	map.waiting = 0;
	var bounds = map.getBounds();
	
	var NE = bounds.getNorthEast();
	var SW = bounds.getSouthWest();
	
	var mapWidth = NE.lng() - SW.lng();
	var mapHeight = NE.lat() - SW.lat();
	
	var maxX = NE.lng();
	var minX = SW.lng();
	
	var markersArray = [];
	
	var dateLine = (maxX<minX)?1:0;
			
  //var xmlAddr = U_XML_ADRESS + "&minx=" + (SW.lng() - 0.5 * mapWidth) + "&miny=" + (SW.lat() - 0.5 * mapHeight) + "&maxx=" + (NE.lng() + 0.5 * mapWidth) + "&maxy=" + (NE.lat() + 0.5 * mapHeight)
  var xmlAddr = U_XML_ADRESS + "&minx=" + SW.lng() + "&miny=" + SW.lat() + "&maxx=" + maxX + "&maxy=" + NE.lat() + "&dateline=" + dateLine;
	
  //GLog.write(xmlAddr);
	
  GDownloadUrl(xmlAddr, function(data, responseCode) {
		
    xmlDoc = GXml.parse(data); //request.responseXML;
				
    var markers = xmlDoc.documentElement.getElementsByTagName("m");
								
    for (var i=0;i<markers.length;i++)
    { 
      var point = new GLatLng(parseFloat(markers[i].getAttribute("ltd")),  parseFloat(markers[i].getAttribute("lng")));

      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 vehcolour = markers[i].childNodes[j].getAttribute("vehcolour");
							var distance = markers[i].childNodes[j].getAttribute("dist");
							
							var distanceStr = (distance == 0 || distance == '') ? '<a href="profile.php?mode=editprofile#mapcoords">Change your location</a>' : 'Distance from you: ' + parseInt(distance/1.609344) + " mi";
							//var userlink = document.createElement("a");
							//userlink.setAttribute("href", U_PROFILE_G + '&u=' + userid);
							//userlink.appendChild(document.createTextNode(username));
							
							var username2 = (distance == 0 || distance == '') ? 'you' : username;
							
							username = (distance == 0 || distance == '') ? username + '</a> (This is you!)' : username + '</a>';
							
							if (IsM == 0)
							{
								infohtml = infohtml + '<span class="mediumtext"><a href="' + U_PROFILE_G + '&u=' + userid + '" class="gen">' + username + '</a><br /><br />'+ distanceStr + '<br /><a href="#" onclick="centerMapAndCloseBubble('+point.lat()+', '+point.lng()+');return false;">Centre map on ' + username2 + '</span>';
								iconloc = vehcolour;
							}
						}
					} // each user
					
					if (IsM == 0)
					{
						var marker = map.createMarker(point, infohtml, iconloc);
						//map.addOverlay(marker);
						markersArray.push(marker);
						//map.overlayList.push(point);
					}
					
				} // each marker

        var markerCluster = new MarkerClusterer(map,markersArray);

				map.busy = 0;

		}) // end function
		
		/* commented out by MARTIN 19/11/06
		
		// ADD POIs
		
		var lastpoint = new GLatLng(0,0);
		
		var xmlAddr = U_XML_ADRESS + "&poi=1&minx=" + SW.lng() + "&miny=" + SW.lat() + "&maxx=" + maxX + "&maxy=" + NE.lat() + "&dateline=" + dateLine;
		
		//GLog.write(xmlAddr);
		GDownloadUrl(xmlAddr, function(data, responseCode) {
		
				xmlDoc = GXml.parse(data); //request.responseXML;
				
				var markers = xmlDoc.documentElement.getElementsByTagName("m");
								
				for (var i=0;i<markers.length;i++)
				{ 
				
					var point = new GLatLng(parseFloat(markers[i].getAttribute("ltd")),  parseFloat(markers[i].getAttribute("lng")));

					if (map.isMarker(point)) var IsM = 1; else var IsM = 0;
					
					infohtml = ''; 

					for (var j=0;j<markers[i].childNodes.length;j++)
					{
						if (markers[i].childNodes[j].nodeName.toLowerCase() == "u")
						{
							var info = markers[i].childNodes[j].firstChild.nodeValue;
							var id = markers[i].childNodes[j].getAttribute("id");
							var icon = markers[i].childNodes[j].getAttribute("icon");
							var distance = markers[i].childNodes[j].getAttribute("dist");
							
							var latest = markers[i].childNodes[j].getAttribute("latest")
							
							var distanceStr = (distance == 0 || distance == '') ? '<a href="profile.php?mode=editprofile#mapcoords">Change your location</a>' : 'Distance from you: ' + parseInt(distance/1.609344) + " mi";
							
							var userid = markers[i].childNodes[j].getAttribute("userid");
							var username = markers[i].childNodes[j].getAttribute("username");
							
							var timestamp = markers[i].childNodes[j].getAttribute("timestamp");
							var formattedtime = markers[i].childNodes[j].getAttribute("formattedtime");
							
							if (IsM == 0)
							{

								//infohtml = infohtml + '<div style="width:396px;"><div style="height:100%;width:189px;float:left;margin:auto 0px auto 0px;"><span class="mediumtext"><img src="../images/mc06.gif" alt="Morocco Challenge 2006">&nbsp;&nbsp;<a style="position:relative;top:-14px" href="' + U_PROFILE_G + '&u=' + userid + '">' + username + '</a><br /><br />'+ distanceStr + '<br />' + '<a href="#" onclick="centerMapAndCloseBubble('+point.lat()+', '+point.lng()+');return false;">Centre map on ' + username + '</a></span></div><div style="padding:4px;width:198px;float:left;border-left:1px solid #AAAAAA;"><span class="mediumtext"><b>' + formattedtime + '</b><br /><br />' + info + '</span></div></div>';
								
								infohtml = infohtml + '<div style="width:396px;"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="middle" align="center" style="width:189px"><span class="mediumtext"><img src="../images/mc06.gif" alt="Morocco Challenge 2006">&nbsp;&nbsp;<a style="position:relative;top:-14px" href="' + U_PROFILE_G + '&u=' + userid + '">' + username + '</a><br /><br />'+ distanceStr + '<br />' + '<a href="#" onclick="centerMapAndCloseBubble('+point.lat()+', '+point.lng()+');return false;">Centre map on ' + username + '</a></span></td><td valign="middle" align="center" style="width:198px; border-left:1px solid #AAAAAA;"><span class="mediumtext"><b>' + formattedtime + '</b><br /><br />' + info + '</span></td></tr></table></div>';
								
								iconloc = "../" + icon;
								
								if(latest!='1'){
								
										iconloc = "../poi/dot";
										var poidot = 1;
										
										var polyline = new GPolyline([point, lastpoint], "#ff5200", 4, 0.5);
										map.addOverlay(polyline);
										
										lastpoint = point;
										
								} else {
								
										var poidot = 0;

										lastpoint = point;
								
								}									
								
							}
						}
						
					} // each user
					
					if (IsM == 0)
					{
						var marker = map.createMarker(point, infohtml, iconloc, poidot);

						map.addOverlay(marker);
						map.overlayList.push(point);
					}
					
				} // each marker

				map.busy = 0;

		}) // end function
		
		// end ADD POIS
		
		*/

	//request.send(null);
}
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;
}
