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.1, 5.5 ) );
		var mapZoom = ( args.center ? args.center.lvl : mapMinZoom );
		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 );
		
		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 mapToBounds() {
	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 mapCreateMarker(lat, lng, html, options) {
	var point = new GLatLng( parseFloat( lat ), parseFloat( lng) );
	mapBounds.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 mapNaarAdres( Adres ) {
	mapGeocoder.getLatLng( Adres+', Nederland', function( LatLng ) {
		if ( LatLng ) {
			mapToLatLng( LatLng.lat(), LatLng.lng(), 15 );
		}
	} );
	
	return false;
}

function mapStreetviewBeschikbaar( Lat, Lng, CallBack ) {
	if ( !map ) { return false; }
	
	var panoClient = new GStreetviewClient();
	panoClient.getNearestPanorama( new GLatLng( Lat, Lng), CallBack );
}

function mapInitIconen() {
	if ( mapIcons["cirkels"] ) {
		return;
	}
	mapIcons["cirkels"] = {};
	
	var cirkelFormaten = [30,38,46,58,68,80];
	for ( var n = 0; n < cirkelFormaten.length; n++ ) {
		var formaat = cirkelFormaten[ n ];
		
		mapIcons["cirkels"][ formaat ] = new GIcon();
		mapIcons["cirkels"][ formaat ].image = '/images/icoon/cirkel-'+formaat+'.png';
		mapIcons["cirkels"][ formaat ].hoverImage = '/images/icoon/cirkel-'+formaat+'-hover.png';
		mapIcons["cirkels"][ formaat ].iconAnchor = new GPoint( formaat / 2, formaat / 2 );
		mapIcons["cirkels"][ formaat ].iconSize = new GSize( formaat, formaat );
	}
	
	mapIcons["markers"] = {};
	mapIcons["markers"]["item"] = new GIcon();
	mapIcons["markers"]["item"].image = '/images/icoon/marker-item.png';
	mapIcons["markers"]["item"].iconSize = new GSize(21, 28);
	mapIcons["markers"]["item"].iconAnchor = new GPoint(14, 20);
	mapIcons["markers"]["item"].infoWindowAnchor = new GPoint(10, 10);
	mapIcons["markers"]["item"].shadow = '/images/icoon/marker-item-schaduw.png';
	mapIcons["markers"]["item"].shadowSize = new GSize(36, 28);
	
	mapIcons["markers"]["cluster"] = new GIcon();
	mapIcons["markers"]["cluster"].image = '/images/icoon/marker-cluster.png';
	mapIcons["markers"]["cluster"].iconSize = new GSize(25, 31);
	mapIcons["markers"]["cluster"].iconAnchor = new GPoint(13, 31);
	mapIcons["markers"]["cluster"].infoWindowAnchor = new GPoint(13, 12);
	mapIcons["markers"]["cluster"].shadow = '/images/icoon/marker-cluster-schaduw.png';
	mapIcons["markers"]["cluster"].shadowSize = new GSize(41, 31);
	
	mapIcons["markers"]["huidig"] = new GIcon();
	mapIcons["markers"]["huidig"].image = '/images/icoon/marker-huidig.png';
	mapIcons["markers"]["huidig"].iconSize = new GSize(23, 30);
	mapIcons["markers"]["huidig"].iconAnchor = new GPoint(15, 21);
	mapIcons["markers"]['huidig'].infoWindowAnchor = new GPoint(12, 12);
	mapIcons["markers"]['huidig'].shadow = '/images/icoon/marker-huidig-schaduw.png';
	mapIcons["markers"]['huidig'].shadowSize = new GSize(39, 30);
}
