var map = null;
var markersArray = [];
var homeMarker;
var _message;
var _title;
var defaultCenterLatLng = null;

var styles = [{
		url: getBaselocationUrl() + '/../img/google-map/cluster-s.png',
		height: 48,
		width: 46,
		opt_anchor: [5, 24],
		opt_textColor: '#fff'
	},
	{
		url: getBaselocationUrl() + '/../img/google-map/cluster-m.png',
		height: 52,
		width: 53,
		opt_anchor: [5, 27],
		opt_textColor: '#fff'
	},
	{
		url: getBaselocationUrl() + '/../img/google-map/cluster-l.png',
		height: 55,
		width: 61,
		opt_anchor: [5, 30],		
		opt_textColor: '#fff'
}];					
var mcOptions = {gridSize: 75, maxZoom: 11, styles: styles};

var defaultZoomLevel = 8;
var maximumZoomLevel = 14;
var isLoadingMap = false;
var isMapLoaded = false;
var areMarkersAdded = false;
var tilesLoadedListener;

/**
 * Load the map if not loaded already
 */
function loadMap() {

	if ( !isLoadingMap ) {
		isLoadingMap = true;
		
		// Dynamic load google API
		callGoogleApi( function() {
			if ((!isMapLoaded) && $("#map").length != 0) {
				initializeMaps();
				GUnload;
			}
		});
	}
}

/**
 * Perform initialization of map object
 */
function initializeMaps() { 
		
		// Initialize object
		map = new GMap2(document.getElementById("map"));
		
		// Add listener
		tilesLoadedListener = GEvent.addListener(map, "tilesloaded", function() {
			mapLoaded();
            //GEvent.removeListener(tilesLoadedListener);
		});
		
		// Set options
		var ui = new GMapUIOptions();
		ui.maptypes = {normal:true};
		ui.zoom = {};
		ui.controls = {largemapcontrol3d:true};
		map.setUI(ui);

		// Set default center
		defaultCenterLatLng = new GLatLng(52.0861294, 5.1080317);
		
		// Perform zoom
		zoom();
}

/**
 * Map is loaded, added markers and fadeOut screen...
 * NOTE: Guard for addition of markers is necessary. zoom(); will also call mapLoaded
  */
function mapLoaded() {
	
	if (!isMapLoaded) {
        // Add all markers to map
        if ( !areMarkersAdded ) {
            areMarkersAdded = true;
            setupMarkers();
        }

        // Set busy state
        $("#mapLoader").each(function() {
            // Get coordinates
            $(this).fadeOut(800);
        });
    }

    // Update state
    isMapLoaded = true;

}

function addMarkers(lat, long, numberOfJobs, company, url) {
	
	//Add Icon     
	var IconRabo = new GIcon(G_DEFAULT_ICON);
	if(numberOfJobs < 10) {
		IconRabo.image = getBaselocationUrl() + '/../img/google-map/flag' + numberOfJobs + '.png';
	} else {
		IconRabo.image = getBaselocationUrl() + '/../img/google-map/flag9plus.png';
	}
	IconRabo.imageMap = [0,0, 37,0, 37,52, 0,52];
	IconRabo.iconSize = new GSize(55, 51);
	IconRabo.iconAnchor = new GPoint(26,55);
	IconRabo.infoWindowAnchor = new GPoint(70,65);
											
	//Add Markers
	var marker = new GMarker(new GLatLng(lat, long), {icon:IconRabo});
	marker.numberOfJobs = numberOfJobs;
	marker.popupMessage = "";
	markersArray.push(marker);

	GEvent.addListener(marker, 'click', function() {
				
		// Test if html is preloaded
		if ( marker.popupMessage == "") {
			// Load html

			$.ajax({
				url: url,
				dataType: 'text',
				success: function(data){

					// Cache message
					marker.popupMessage = buildMessage(data, marker.getPoint());
					
					// Display popup
					marker.openExtInfoWindow(
						map,
						'popupMap',
						marker.popupMessage,
						{paddingX: 5, paddingY: 5}
					);
				},
				error: function() {
					// Display popup
					marker.openExtInfoWindow(
						map,
						'popupMap',
						msgFailureLocationDetails,
						{paddingX: 5, paddingY: 5}
					);
				}
			});
		} else {
			marker.openExtInfoWindow(
				map,
				'popupMap',
				marker.popupMessage,
				{paddingX: 5, paddingY: 5}
			);
		}
	});
}

function buildMessage(message, point) {
	if(homeMarker != null)
	{
		var distancePoint = point.distanceFrom(homeMarker.getPoint())/100;
		var roundedDistance = Math.round(distancePoint)/10;
	}
	
	return message.replace("#DISTANCE#", roundedDistance);
}

function zoom() {  
	var lat = $("#lat").val();
	var lng = $("#lng").val();
	
	// Determine bounds for markers 
	var markerBounds;
	if ( markersArray.length > 0 ) {
		markerBounds = getMarkerBounds();
	}

	// Build homeMarker
	if ( ( homeMarker == null ) && ( lat != "" ) && (lng != "" ) ) {
		var point = new GLatLng(lat, lng);
		addHomeMarker(point);
		
		// Update distance fields
		$(".positionDistance").each(function() {
			// Get coordinates
			lat = $(this).attr("lat");
			lng = $(this).attr("lng");
			
			// Build message
			message = msgLocationDistance;
			message = buildMessage( message, new GLatLng(lat, lng) );
			
		    $(this).html(message);
		  });

	}
	
	// Determine center
	if ( markerBounds  ) {
		map.setCenter( markerBounds.getCenter() );
	} else if ( homeMarker != null ) {
		map.setCenter( homeMarker.getLatLng() );
	} else {
		map.setCenter( defaultCenterLatLng );
	}
	
	// Determine zoomlevel
	var zoomLevel;
	if ( markerBounds ) {
		zoomLevel = map.getBoundsZoomLevel( markerBounds );
		if ( zoomLevel > maximumZoomLevel ) {
			zoomLevel = maximumZoomLevel;
		}
	} else {
		zoomLevel = defaultZoomLevel;
	}
	map.setZoom( zoomLevel );
	map.panBy( new GSize( 0, 27 ) );
	
}

function getMarkerBounds() {

	var marker = markersArray[0];
	var latlng = marker.getLatLng();
	
	// Set vars with first marker
	var minlat = latlng.lat();
	var maxlat = latlng.lat();
	var minlng = latlng.lng();
	var maxlng = latlng.lng();
	
	// Loop all other items
	for ( var i=1, len=markersArray.length; i<len; ++i ){
		marker = markersArray[i];
		latlng = marker.getLatLng();
		
		if ( minlat > latlng.lat() ) minlat = latlng.lat();
		if ( maxlat < latlng.lat() ) maxlat = latlng.lat();
		if ( minlng > latlng.lng() ) minlng = latlng.lng();
		if ( maxlng < latlng.lng() ) maxlng = latlng.lng();
	}
	
	// Add homeMarker if necessary
	if ( homeMarker != null ) {
		latlng = homeMarker.getLatLng();
		
		if ( minlat > latlng.lat() ) minlat = latlng.lat();
		if ( maxlat < latlng.lat() ) maxlat = latlng.lat();
		if ( minlng > latlng.lng() ) minlng = latlng.lng();
		if ( maxlng < latlng.lng() ) maxlng = latlng.lng();
	}
	
	return new GLatLngBounds( new GLatLng( maxlat, minlng ), new GLatLng( minlat, maxlng ) );
}

function addHomeMarker(mapCenter) {
	var IconHome = new GIcon(G_DEFAULT_ICON);
	IconHome.image = '../img/google-map/flag-home.png';
	IconHome.shadow = '';
	IconHome.imageMap = [8,0, 31,0, 31,49, 8,49];
	IconHome.iconSize = new GSize(55, 49);
	IconHome.iconAnchor = new GPoint(26,55);
	homeMarker = new GMarker(mapCenter,{icon:IconHome});
	map.addOverlay(homeMarker);
}
