addEvent(window,'load',initialize_map);
addEvent(window,'load',initialize_links);
addEvent(window,'load',initialize_sluitbutton);
addEvent(window,'load',initialize_map2);


/* hulpfunctie om meerdere javascript-functies aan te roepen */
function addEvent(obj, evType, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, true);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent('on'+evType, fn);
		return r;
	} else {
		return false;
	}
}

/* hulpfunctie om positie van de cursor te bepalen [(c) Peter Paul Koch, http://www.quirksmode.org/js/events_properties.html ] */
function getPosition(e) {
    e = e || window.event;
    var cursor = {x:0, y:0};
    if (e.pageX || e.pageY) {
        cursor.x = e.pageX;
        cursor.y = e.pageY;
    } 
    else {
        var de = document.documentElement;
        var b = document.body;
        cursor.x = e.clientX + 
            (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
        cursor.y = e.clientY + 
            (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
    }
    return cursor;
}


/* hulpfunctie 'getElementsByClassName'	[(c) Robert Nyman, http://www.robertnyman.com, http://code.google.com/p/getelementsbyclassname/ ] */	
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

// initialiseer linkjes
function initialize_links() {
	var links = getElementsByClassName('GMlink','a');
	
	// maak mouseclick die functie findLocation(address) aanroept 
	for(var i=0;i<links.length;i++) { 
	
		links[i].onclick = function showGM(event) {
			
			// bepaal positie cursor
			var cursor = getPosition(event);
			//var xpos = cursor.x;
			var ypos = cursor.y;
			
			// maak kaart zichtbaar
			var map_container = document.getElementById('map_container');
			map_container.style.visibility = 'visible';
			map_container.style.top = ypos + 'px';
			
			var adres = this.getAttribute('rel');
			
			// splits evt. gegevens uit "rel"-attribuut [heeft format "naam: straat #, plaats, nederland"]  
			if(adres.indexOf(': ') != -1) {
				adres = adres.split(': ')[1];
			}
			
			findLocation(adres);	
			return false;
		}
	}
}

// initialiseer sluitbutton 
function initialize_sluitbutton() {
	
	var sluitbutton = document.getElementById('sluitbutton');
	
	sluitbutton.onclick = function() {
		
		var map_container = document.getElementById('map_container');
		map_container.style.visibility = 'hidden';
		return false;
	}
}


/* Google Map API-functies */
// definieer variabelen
var map;
var geocoder;

// initialiseer kaart [wordt afgebeeld in <div> met id="map_canvas"]
function initialize_map() {
	
	map = new GMap2(document.getElementById('map_canvas'));
	
	// start met Nederland op zoomlevel 7
	map.setCenter(new GLatLng(52.1,5.3),7);
	
	// definieer standaard Google-userinterface
	var customUI = map.getDefaultUI();
	customUI.maptypes.hybrid = false;
	map.setUI(customUI);
	
	// inititialiseer geocoding
	geocoder = new GClientGeocoder();
}

// toon opgevraagde adres op kaart     
function addAddressToMap(response) {
	
	// reset kaart
	map.clearOverlays();
	if (!response || response.Status.code != 200) {
		alert('Sorry, dat adres is niet te vinden op de kaart');
	} else {
		
		// plaats marker met tekst
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
		marker = new GMarker(point);
		map.addOverlay(marker);
		var html = place.address.replace('The Netherlands','Nederland');
		marker.openInfoWindowHtml(html);
		
		// zoom in op zoomlevel [hier 14]
		map.setZoom(14);
	}
}

// functie om linkjes te koppelen aan kaart 
function findLocation(address) {
	geocoder.getLocations(address, addAddressToMap);
}

// initialiseer kaart [wordt afgebeeld in <div> met id="map_canvas2"]
// definieer variabelen
var map2;
var geo;
     
function get_links() {
	var links = getElementsByClassName('GMlink','a');
	var adressen = new Array();

	// maak mouseclick die functie findLocation(address) aanroept 
	for(var i=0;i<links.length;i++) { 
	
		adressen[i] = links[i].getAttribute('rel');
	}
	
	return adressen;
}

function initialize_map2() {
	
	map2 = new GMap2(document.getElementById('map_canvas2'));
	
	// start met Nederland op zoomlevel 7
	map2.setCenter(new GLatLng(52.1,5.3),7);
	
	// definieer standaard Google-userinterface
	var customUI = map2.getDefaultUI();
	customUI.maptypes.hybrid = false;
	map2.setUI(customUI);
	
	// inititialiseer geocoding
	geo = new GClientGeocoder();

	// maak loop doro adressen-array
	theNext();
}

/* geocoding voor grote kaart, deels gebaseerd op http://econym.org.uk/gmap/example_geomulti.htm */
var delay = 100;
var temp = new Array();
var names = new Array();
var addresses = new Array();
var nextAddress = 0;

function getAddress(name, search, next) {
	
	geo.getLocations(search, function (result) {
		
		function createMarker(point,html) {
			var marker = new GMarker(point);
			GEvent.addListener(marker, 'click', function() {
				marker.openInfoWindowHtml(html);
			});
			
			return marker;
		}
		
		// if that was successful
		if (result.Status.code == G_GEO_SUCCESS) {
			
			// lets assume that the first marker is the one we want
			var p = result.Placemark[0].Point.coordinates;
			var lat=p[1];
			var lng=p[0];
			var txt = '<strong>' + name + '</strong><br>' + search;
			
			point = new GLatLng(lat,lng);
			marker = createMarker(point,txt);
			map2.addOverlay(marker);
			
		} else {
			// if we were sending the requests to fast, try this one again and increase the delay
			if (result.Status.code == G_GEO_TOO_MANY_QUERIES) {
				nextAddress--;
				delay++;
			}
		}
		
		next();
	});
 }
  
// function to call the next geocode-operation when the reply comes back
function theNext() {
	addresses = get_links();
	
	// splits evt. gegevens uit "rel"-attribuut [heeft format "naam: straat #, plaats, nederland"]  
	if(addresses[nextAddress]) {
		if(addresses[nextAddress].indexOf(': ') != -1) {
			temp = addresses[nextAddress].split(': ');
			names[nextAddress] = temp[0];
			addresses[nextAddress] = temp[1];
		}
	}	
	
	if (nextAddress < addresses.length) {
		setTimeout('getAddress("' + names[nextAddress] + '","' + addresses[nextAddress] + '",theNext)', delay);
		nextAddress++;
	}
}
