var map = false;
var mapMaxZoom = 18;
var mapMinZoom = 7;
var mapInfowindow;
var mapBounds;
var mapGeocoder;
var mapIcons = {};

function mapInit( args ) {
	if ( !map && GBrowserIsCompatible() ) {
		map = new GMap2( $("#map-canvas")[0] );
		$(document).unload( function() { GUnload(); } );
		
		mapMinZoom = ( args.minZoom ? args.minZoom : mapMinZoom );
		mapMaxZoom = ( args.maxZoom ? args.maxZoom : mapMaxZoom );
		
		var mapCenter = ( args.center ? new GLatLng( args.center.lat, args.center.lng ) : new GLatLng( 52.370568669179654, 4.898185729980469 ) );
		var mapZoom = ( args.center ? args.center.lvl : 14 );
		map.setCenter( mapCenter, mapZoom );
		
		var customUI = map.getDefaultUI();
		customUI.zoom.scrollwheel = true;
		customUI.controls.largemapcontrol3d = ( !args.controls || args.controls.zoom );
		customUI.controls.scalecontrol = false;
		customUI.controls.menumaptypecontrol = true;
		customUI.maptypes.physical = true;
        map.setUI( customUI );
		
		// MapCross control
		mapCrossControl = new MapCrossControl();
		if ( args.controls && args.controls.cross ) {
			map.addControl( mapCrossControl );
		}
		
		var mt = map.getMapTypes();
		for ( var n = 0; n < mt.length; n++ ) {
			mt[ n ].getMinimumResolution = function () { return mapMinZoom; };
			mt[ n ].getMaximumResolution = function () { return ( this.getName() == 'Terrein' && mapMaxZoom > 15 ? 15 : mapMaxZoom ); };
		}
		
		mapBounds = new GLatLngBounds();
		mapIcons['markers'] = {};
		
		mapGeocoder = new GClientGeocoder();
		mapGeocoder.setBaseCountryCode('NL');
		
		mapInfowindow = map.getInfoWindow();
		
		mapUpdatePos();
	}
}

function mapToLatLng(lat, lng, lvl) {
	lvl = (lvl ? lvl : map.getZoom());
	map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(lvl));
}

function mapUpdatePos() {
	mapBounds = map.getBounds();
}

function mapGetBoundSw(padding) {
	var sw = map.fromLatLngToContainerPixel(mapBounds.getSouthWest());
	return map.fromContainerPixelToLatLng(new GPoint(sw.x-padding, sw.y+padding) );
}

function mapGetBoundNe(padding) {
	var ne = map.fromLatLngToContainerPixel(mapBounds.getNorthEast());
	return map.fromContainerPixelToLatLng(new GPoint(ne.x+padding, ne.y-padding) );
}

function mapToBound() {
	var lat = (mapBounds.getNorthEast().lat() + mapBounds.getSouthWest().lat()) /2;
	var lng = (mapBounds.getNorthEast().lng() + mapBounds.getSouthWest().lng()) /2;
	var lvl = map.getBoundsZoomLevel(mapBounds);
	
	map.setZoom(lvl);
	map.setCenter(new GLatLng(lat, lng));
}

function mapToAddress( Address ) {
	mapGeocoder.getLatLng( Address + ' Amsterdam, Nederland', function( LatLng ) {
		if ( LatLng ) {
			mapToLatLng( LatLng.lat(), LatLng.lng(), 15 );
		}
	} );
	
	return false;
}

function mapCreateMarker(lat, lng, html, options) {
	var point = new GLatLng( parseFloat( lat ), parseFloat( lng) );
	mapBound.extend(point);
	
	var marker = new GMarker(point, options);
	if (html) {
		marker.html = html;
		GEvent.addListener(marker, "click", function() {
			this.openInfoWindowHtml(this.html);
		});
	}
	
	return marker;
}

function mapImportanceOrder(marker, b) {
	return ( GOverlay.getZIndex(marker.getPoint().lat()) * -1 );
}

function mapLoadIcons() {
	mapIcons["markers"] = {};
	mapIcons["markers"]["koninginnedag"] = new GIcon();
	mapIcons["markers"]["koninginnedag"].image = '/images/icoon/marker-koninginnedag.png';
	mapIcons["markers"]["koninginnedag"].iconSize = new GSize(21, 28);
	mapIcons["markers"]["koninginnedag"].iconAnchor = new GPoint(14, 20);
	mapIcons["markers"]["koninginnedag"].infoWindowAnchor = new GPoint(10, 10);
	mapIcons["markers"]["koninginnedag"].shadow = '/images/icoon/marker-normaal-schaduw.png';
	mapIcons["markers"]["koninginnedag"].shadowSize = new GSize(36, 28);
	
	mapIcons["markers"]["koninginnenacht"] = new GIcon();
	mapIcons["markers"]["koninginnenacht"].image = '/images/icoon/marker-koninginnenacht.png';
	mapIcons["markers"]["koninginnenacht"].iconSize = new GSize(21, 28);
	mapIcons["markers"]["koninginnenacht"].iconAnchor = new GPoint(14, 20);
	mapIcons["markers"]["koninginnenacht"].infoWindowAnchor = new GPoint(10, 10);
	mapIcons["markers"]["koninginnenacht"].shadow = '/images/icoon/marker-normaal-schaduw.png';
	mapIcons["markers"]["koninginnenacht"].shadowSize = new GSize(36, 28);
	
	for ( var n = 0; n <= 5; n++ ) {
		mapIcons["markers"]["hotel"+n] = new GIcon();
		mapIcons["markers"]["hotel"+n].image = '/images/icoon/marker-hotel'+( n ? '-'+n+'ster' : '')+'.png';
		mapIcons["markers"]["hotel"+n].iconSize = new GSize(21, 28);
		mapIcons["markers"]["hotel"+n].iconAnchor = new GPoint(14, 20);
		mapIcons["markers"]["hotel"+n].infoWindowAnchor = new GPoint(10, 10);
		mapIcons["markers"]["hotel"+n].shadow = '/images/icoon/marker-normaal-schaduw.png';
		mapIcons["markers"]["hotel"+n].shadowSize = new GSize(36, 28);
	}
}

/* CrossControl */
function MapCrossControl() {}
MapCrossControl.prototype = new GControl();
MapCrossControl.prototype.initialize = function( map ) {
	var container = document.createElement("div");
	
	// Icoon
	container.innerHTML = "&nbsp;";
	container.id = 'gm-cross';
	
	// Container aan de map toevoegen
	map.getContainer().appendChild( container );
	
	return container;
}