var map = null;
var geocoder = null;
var icon = null;
var fulljoints = new Array();
var occupiedpoints = new Array();
var totaljoints = 0;
var iteratedJoints = 0;
var shownMarkers =0;
var failedAddressLookups =0;
var showRuns = 0;
var id=0;
var gloadhasrun = 0;
var k = 0;
var localCodes = 0;
var lookedUpCodes = 0;

function createMarker(point,name,html,recommendation) {
	
	latitude = point.lat();
	longtitude = point.lng();
	
	// Nudge any markers that would obscure existing markers.
	
	for(i=0;i < occupiedpoints.length;i++){
	
		if((occupiedpoints[i][0] - latitude < 0.000050) && (occupiedpoints[i][0] - latitude > -0.000050) && (occupiedpoints[i][1] - longtitude < 0.000050) && (occupiedpoints[i][1] - longtitude > -0.000050)){
		
			newlatitude = latitude;
			newlongtitude = longtitude + 0.000500;
			point = new GLatLng(parseFloat(newlatitude),parseFloat(newlongtitude));
			
			latitude = newlatitude;
			longtitude = newlongtitude;
		}
	}

	occupiedpoints.push([latitude,longtitude]);
	
	if(recommendation==1){
		var marker = new GMarker(point, {icon:icon2});
	}else{
		var marker = new GMarker(point, {icon:icon});
	}
	
	marker.bindInfoWindowHtml(html);
	return marker;
}
	
function showJoint(id,address,name,streetname,housenumber,housenumbersuffix,url,tags,description,recommendation,lat,lng) {
	
	iteratedJoints++;
	
	html = "<span class='largemaptitle'>" + 
			unescape(name) + "</span><br>" + 
			streetname+ " " + housenumber + " " +
			housenumbersuffix + "<br><br><div class='largemaptags'>"+
			unescape(tags)+"</div><br><div class='largemapdesc'>"+
			unescape(description.substring(0,75))+
			"...</div><br><a class='c3 b' href='" +
			escape(url) + "'>Bekijk</a><br><br>";

	if(lat && lng){
	
		var point = new GLatLng(parseFloat(lat),
								parseFloat(lng));
					
		var marker = new createMarker(point,name,html,recommendation);

		map.addOverlay(marker);
  
		shownMarkers++;
		localCodes++;
			
		showNextJoint();

	}else{

		// Look up the code from the database and otherwise Google
		
		lookedUpCodes++;
		
		GDownloadUrl("/geocode/lookup/"+escape(address)+"/",function(data,responseCode){
	
			if(responseCode == 200) {
				var xml = GXml.parse(data);
				var geocodes = xml.documentElement.getElementsByTagName("geocode");
				if(geocodes[0]){
						var point = new GLatLng(parseFloat(geocodes[0].getAttribute("lat")),
												parseFloat(geocodes[0].getAttribute("long")));
				}
				
				if(point){
					
					
					var marker = new createMarker(point,name,html,recommendation);
	
					map.addOverlay(marker);
			  
					shownMarkers++;
						
					showNextJoint();
	
				}else{
				
					var geocoder = new GClientGeocoder();
		
					if (geocoder) {
					
						geocoder.getLatLng(
							address,
							function(point) {
								if (!point) {
									failedAddressLookups++;
									
									showNextJoint();
								
								} else {
									
									GDownloadUrl("/geocode/store/"+point.lat()+"/"+point.lng()+"/"+escape(address)+"/",function(data,responseCode){
										if(responseCode == 200) {
										
										}
									});
									
									var marker = new createMarker(point,name,html,recommendation);
									map.addOverlay(marker);
	
									shownMarkers++;
									
									if(iteratedJoints==totaljoints){
										// Done
									}else{
										setTimeout("showNextJoint()",50); // Be nice to the Googles.
									}
								}
							}
						);   
					}
				}
				
				
			} else if(responseCode == -1) {
				// Data request timed out.;
			} else { 
				// Request resulted in error.
			}
		});
		
	}
	
	//document.getElementById("top_right").innerHTML = "Local: "+localCodes+"<br>Looked up:"+lookedUpCodes;
}


function showNextJoint(){
	
	var j=0;
	
	k++;
	
	if(k<fulljoints.length){
		
		j=1;
		
		showJoint(fulljoints[k]['ID'],fulljoints[k]['AddressString'],fulljoints[k]['Name'],fulljoints[k]['StreetName'],fulljoints[k]['HouseNumber'],fulljoints[k]['HouseNumberSuffix'],fulljoints[k]['URL'],fulljoints[k]['Tags'],fulljoints[k]['Description'],fulljoints[k]['Recommendation'],fulljoints[k]['lat'],fulljoints[k]['lng']);
		
	//	document.getElementById('progress_bar').style.width = (2 * k) + "px";
		
		showRuns++;
	}else{
		// done?
		
		document.getElementById('gmap_progress').style.display='none';
	}
}

function gload(){
	setTimeout(realgload,1000); // Delay to give IE6 time to cache the first image loads
}

function realgload() {


  if (GBrowserIsCompatible() && gloadhasrun==0) {
      gloadhasrun=1;
	  
	  icon = new GIcon();
	  icon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";
	  icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	  icon.iconSize = new GSize(12, 20);
	  icon.shadowSize = new GSize(22, 20);
	  icon.iconAnchor = new GPoint(6, 20);
	  icon.infoWindowAnchor = new GPoint(5, 1);      
		
	  icon2 = new GIcon();
	  icon2.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
	  icon2.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	  icon2.iconSize = new GSize(12, 20);
	  icon2.shadowSize = new GSize(22, 20);
	  icon2.iconAnchor = new GPoint(6, 20);
	  icon2.infoWindowAnchor = new GPoint(5, 1);

	  mapdiv = document.getElementById("largemap");
	 
	  map = new GMap2(mapdiv);
	  map.addMapType(G_PHYSICAL_MAP);
	  setTimeout("map.setMapType(G_PHYSICAL_MAP);",20);
	  
	  geocoder = new GClientGeocoder();
	
	  var largemap = document.getElementById("largemap");
	  
	  if (geocoder) {
		geocoder.getLatLng(Town,
		  function(point) {
			if(point) {
			  map.setCenter(point, 13);
			  map.addControl(new GSmallZoomControl());
			  map.setZoom(14); 
				
			  GDownloadUrl("./xml/", function (doc){
								
					var town = Town;
					
					var xmlDoc = GXml.parse(doc);
					var joints = xmlDoc.documentElement.getElementsByTagName("joint");
					totaljoints = joints.length;

					for (var i = 0; i < joints.length; i++) {
					
						var ID = joints[i].getAttribute("ID");
						var JointName = joints[i].getAttribute("Name");
						var StreetName = joints[i].getAttribute("StreetName");
						var HouseNumber = joints[i].getAttribute("HouseNumber");
						var HouseNumberSuffix = joints[i].getAttribute("HouseNumberSuffix");
						var URL = joints[i].getAttribute("URL");
						var Recommendation = joints[i].getAttribute("Recommendation");
						var lat = joints[i].getAttribute("lat");
						var lng = joints[i].getAttribute("lng");
						var Tags = joints[i].getElementsByTagName("TagCloud")[0].firstChild.nodeValue;
						var Description = joints[i].getElementsByTagName("Description")[0].firstChild.nodeValue;
					  
						var AddressString = StreetName + " " + HouseNumber + ", " + Town + ", "+ Province + ", Netherlands" ;
						
						var thisjoint = new Array();
						
						totaljoints = fulljoints.length;
						
						thisjoint['ID'] = ID;
						thisjoint['Name'] = JointName;
						thisjoint['StreetName'] = StreetName;
						thisjoint['HouseNumber'] = HouseNumber;
						thisjoint['HouseNumberSuffix'] = HouseNumberSuffix;
						thisjoint['AddressString'] = AddressString;
						thisjoint['URL'] = URL;
						thisjoint['Tags'] = Tags;
						thisjoint['Description'] = Description;
						thisjoint['Recommendation'] = Recommendation;
						thisjoint['lat'] = lat;
						thisjoint['lng'] = lng;
						
						fulljoints[i] = thisjoint;
					}
					
					showNextJoint();		
			  });
			}
		  }
		);   
	  }
   }
} 

