
	var view = null;
	var map = null;
	var type = null;
	var input = null;
	var marker = null;
	
	var mapZoomControl = null;
	var mapTypeControl = null;

	function $element(inElement) {
		if(document.getElementById(inElement) !== null) {
			return document.getElementById(inElement);
		}else{
			return false;
		}
	}
	
	//
	
	function getLatLng(inString) {
		var array = inString.split(',');
		return new google.maps.LatLng(array[0], array[1]);
	}
	
	function getView(inString) {
		var array = inString.split(';');
		return {bounds: new google.maps.LatLngBounds(getLatLng(array[0]), getLatLng(array[1])), zoom: array[2]};
	}
	
	function joinView() {
		var array = new Array();
		var bounds = map.getBounds();
		array.push(bounds.getSouthWest().toUrlValue());
		array.push(bounds.getNorthEast().toUrlValue());
		array.push(map.getZoom());
		return array.join(';');
	}
	
	//
	
	function select(inOffset) {
		if(map && 'objects' in jsObjects) {
			var objects = jsObjects['objects'];
			var model = jsObjects['model'];
			for(var i in objects) {
				var object = objects[i];
				switch(model) {
					case 'Themepark':
						if(object[model]['id'] == inOffset) {
							hideInfo();
							view = getView(object[model]['map']);
							map.setCenter(view.bounds.getCenter(), Number(view.zoom));
						}
					break;
					case 'Medium':
						if(object[model]['id'] == inOffset) {
							hideInfo();
							view = getView(object['Themepark']['map']);
							map.setCenter(view.bounds.getCenter()), Number(view.zoom);
							//map.setCenter(getLatLng(object[model]['marker']));
						}
					break;
				}
			}
		}
	}
	
	function showInfo(inOffset) {
		if($element('info' + inOffset)) {
			hideInfo();
			var element = $element('info' + inOffset);
			element.className = 'info';
			minimize();
		}
	}
	
	function hideInfo(inSkipMap) {
		var elements = document.getElementsByTagName('DIV');
		for(var i in elements) {
			if(elements[i] && elements[i].id && elements[i].id.substr(0, 4) == 'info') {
				elements[i].className = 'info hidden';
			}
		}
		maximize();
	}
	
	function minimize() {
		if(map) {
			disableControls();
		}
		if($element('map')) {
			$element('map').className = 'map minimized';
		}
	}
	
	function maximize() {
		if($element('map')) {
			$element('map').className = 'map';
		}
		if(map) {
			enableControls();
		}
	}
	
	function enableControls() {
		if(map) {
			map.enableGoogleBar();
			//map.enableScrollWheelZoom();
			if(mapTypeControl) {
				map.addControl(mapTypeControl);
			}
			if(mapZoomControl) {
				map.addControl(mapZoomControl);
			}
		}
	}
	
	function disableControls() {
		if(map) {
			map.disableGoogleBar();
			map.disableScrollWheelZoom();
			if(mapTypeControl) {
				map.removeControl(mapTypeControl);
			}
			if(mapZoomControl) {
				map.removeControl(mapZoomControl);
			}
		}
	}
	
	//
	
	function loadMaps() {		
		if($element('map')) {
			$element('map').style.backgroundImage = 'none';
			map = new google.maps.Map2($element('map'));
			var sibling = $element('map').nextSibling;
			if('value' in sibling) {
				type = sibling.value;
				input = sibling.nextSibling;
			}
			setupMap();
			setupMarker();
			setupObjects();
			/*
			if($element('MediumThemepark')) {
				$element('MediumThemepark').onblur = function() {
					var option = this.options[this.selectedIndex];
					console.log(option.value);
					console.log(jsObjects);
				} 
			}
			*/
		}
	}
	
	function load() {
		if(useApis) {
			var script = document.createElement('script');
    		script.src = 'http://www.google.com/jsapi?key=ABQIAAAAO1tBPs_XtA1ppmY5JPVxshQYAYdeGM0dLsb6dlyHjAeUlRJjnhQjujRYRJdjnMFORIOXQHxEaUwY6A&callback=loadApis';
    		script.type = 'text/javascript';
    		document.getElementsByTagName('head')[0].appendChild(script);
		}
	}
	
	function loadApis() {
		google.load('maps', '2', {callback: loadMaps});
	}
	
	function unload() {
		if(useApis && 'function' == typeof GUnload) {
			GUnload();
		} 
	}
	
	//
	
	function setupMap() {
		if(type === 'map') {
			view = getView(input.value);
			map.setCenter(view.bounds.getCenter(), Number(view.zoom));
			marker = new google.maps.Marker(map.getCenter(), {
				draggable: true
				});
			google.maps.Event.addListener(marker, 'dragend', function() {
				map.setCenter(marker.getLatLng());
				input.value = joinView();
			});
			map.addOverlay(marker); 
			google.maps.Event.addListener(map, 'moveend', function() {
				input.value = joinView();
				marker.setLatLng(map.getCenter());
			});
		}else{
			map.setCenter(new google.maps.LatLng(49.724479188712984, 4.8779296875), 5);
		}
		map.setMapType(G_HYBRID_MAP);
		mapZoomControl = new GLargeMapControl();
		mapTypeControl = new GMenuMapTypeControl();
		enableControls();
	}
	
	function setupMarker() {
		if(type !== 'marker') {
			return;
		}
		var location = getLatLng(input.value);
		marker = new google.maps.Marker(location, {
			draggable: true
			});
		google.maps.Event.addListener(marker, 'dragend', function() {
			input.value = marker.getLatLng().toUrlValue();
		});
		map.addOverlay(marker);
		map.setCenter(location);
	}
	
	function setupObjects() {
		if('objects' in jsObjects) {
			var objects = jsObjects['objects'];
			var model = jsObjects['model'];
			for(var i in objects) {
				var object = objects[i];
				var marker;
				switch(model) {
					case 'Medium':
						marker = new google.maps.Marker(getLatLng(object['Medium']['marker']), {
							title: object['Medium']['title'],
							clickable: true,
							draggable: false
							});
						google.maps.Event.addListener(marker, 'click', function() {
							this.openInfoWindowHtml('<strong>' + this.object['Medium']['title'] + '</strong><p>' + this.object['Themepark']['name'] + '</p><p><a class="info text" href="javascript:showInfo(' + this.object['Medium']['id'] + ');">Meer informatie</a></p>');
						});
					break;
					case 'Themepark':
						var view = getView(object['Themepark']['map']);
						marker = new google.maps.Marker(view.bounds.getCenter(), {
							title: object['Themepark']['name'],
							clickable: true,
							draggable: false
							});
						google.maps.Event.addListener(marker, 'click', function() {
							this.openInfoWindowHtml('<strong>' + this.object['Themepark']['name'] + '</strong><p>' + this.object['Themepark']['location'] + ', ' + this.object['Themepark']['country'] + '</p><a class="info text" href="javascript:showInfo(' + this.object['Themepark']['id'] + ');">Meer informatie</a></p>');
						});
					break;
				}
				marker.object = object;
				map.addOverlay(marker);				
			}
		}
	}
