// depends on common.js, google_map-API and log4javascript.js


// The markers array is a 2 dimensional array that holds all markers per page.
// e.g. markers[0][i] holds all markers for the first page.
var google_map_markers;
var google_map_object;
var google_map_center;
var google_map_markerIcon;
var google_map_directions;
var google_map_dealerPerPage;
var google_map_numberOfPages;
var google_map_dealersize;

var google_map_currentsite;
// this field holds the current paging number - starts with 0 for first page
var google_map_currentpage = 0;
var google_map_dealerId;

function gMap_init(_dealerPerPage, _numberOfPages, _markerIconUrl, _dealersize, _mapWidth, _mapHeight) {
	log.info("Initializing Map");
	google_map_dealerPerPage = _dealerPerPage;
	google_map_numberOfPages = _numberOfPages;
	google_map_dealersize = _dealersize;
	
	gMap_initMarkerIcon (_markerIconUrl);
	gMap_initMarkersAndMapCenter ();
	gMap_initMap(_mapWidth, _mapHeight);
    gMap_setAllMarkersOnMap();
    
	initRoutingListener();
    
	gMap_initSiteListener();
}

function initRoutingListener () {	
	mrm.$('#addressFrom').keypress(function(e) {
		if (e.keyCode == '13') {
			do_routePlanning();
			return false;
		}
	});
}

function gMap_initSiteListener() {
	//instantiate DealerlistListener for Map (sets the markers)
	siteListenerForMap = new DefaultListener;
	//reset the markers when change in dealerlist occurs
	siteListenerForMap.actionPerformed = function (site, parameter) {
	    log.info("SiteListenerForMap - performing action: site=" + site + " parameter=" + parameter);
	    
		if (site == "site_dealerlist") {
			if (parameter == null || parameter < 0) {
				parameter = google_map_currentpage;
			}
			mrm.$('#planRouteForm').hide();
			mrm.$('.googledir').hide();
			gMap_showMarkersOfPage(google_map_currentpage, parameter);
	    	//google_map_object.returnToSavedPosition();
	    	google_map_currentpage = parameter;
	    	mrm.$('#directions').hide();
		} 
		else if (site == "site_dealerdetails"){
			google_map_dealerId = parameter;
			gMap_panToCurrentDealer();
			gMap_hideDealersExceptForCurrent();
			mrm.$('#planRouteForm').hide();
			mrm.$('.googledir').hide();
			mrm.$('#directions').hide();			
		}
		else if (site == "site_planRoute"){
			google_map_dealerId = parameter;
			gMap_hideDealersExceptForCurrent();
			mrm.$('.googledir').hide();
			mrm.$('#directions').hide();
			mrm.$('#planRouteForm').show();			
			gMap_panToCurrentDealer();
			showRouteForm(google_map_dealerId);			
		} 
		else if (site == "site_routingResults") {
			mrm.$('#planRouteForm').show();
			mrm.$('#googleMapError').hide();
			mrm.$('#googleMapMessage').show();
			mrm.$('#directions').show();
		}
		else {
			log.debug("SiteListenerForMap - Request not implemeneted for site: " + site);
		}
		google_map_currentsite = site;

	} 

	if (siteController) {
		siteController.addListener("SiteListenerForMap", siteListenerForMap);
		log.info("SiteListenerForMap : pageListenerForMap has been added");
	} else {
		log.warn("SiteListenerForMap : could not add pageListenerForMap. Cause: siteController does not exist.");
	}
}

function gMap_initMarkerIcon (_markerIconUrl) {
	log.debug("MAP -	Initializing map icon");
	var markerIconUrl;
	var icon_prefix = "";
	
	if (_damPath!=null && _damPath!='') {
		icon_prefix=_damPath;
	} else if (_bypass != null && _bypass!="") {
		icon_prefix=_bypass;
	} else {
		_markerIconUrl = "http://www.opel.de/res/img/opel-logo-shadow.png";
	}
	markerIconUrl = icon_prefix+_markerIconUrl;
	google_map_markerIcon = new GIcon();
	google_map_markerIcon.image = markerIconUrl;
	google_map_markerIcon.iconSize = new GSize(32,32);
	google_map_markerIcon.iconAnchor = new GPoint(16,11);
	google_map_markerIcon.infoWindowAnchor = new GPoint(10, 0);
    log.debug("icon: " + google_map_markerIcon.image);
    	
}

function gMap_initMap(mapWidth, mapHeight) { 
	log.debug("Map -	Drawing google map");
	mrm.$('#dl_dealer_map_id').show();
	mrm.$('#map_canvas').attr('style', 'width: '+ mapWidth +'px; height: '+ mapHeight +'px');
	
	if (GBrowserIsCompatible()) { 
		google_map_object = new GMap2(document.getElementById("map_canvas"));
		google_map_object.addControl(new GLargeMapControl());
	    google_map_object.addControl(new GMapTypeControl());
	    //google_map_object.setCenter(google_map_center, 10);
	} 
} 

function gMap_initMarkersAndMapCenter() {
	log.debug("Map -	Initializing map markers");
	google_map_markers = new Array(google_map_numberOfPages);
	var pageNumber = 0;		
	if (GBrowserIsCompatible()) {
		mrm.$('body').find('.mds-cmp-dealer_information').each(function(i) {
    		var latitude = mrm.$(this).find('.location .latitude').html();
    		var longitude = mrm.$(this).find('.location .longitude').html();
    		var dealer_no = '<span class="dealer_id">' + mrm.$(this).find('.dealer_id').html() + '</span>';
    		var dealer_address = mrm.$(this).find('.dealer-address').html();
    		var dealer_links_ul = "";
    		var dealer_links = "";
    		var dealer_links_ul_tmp = mrm.$(this).find('.dealer-links').html();
    		var dealer_links_tmp = mrm.$(this).find('.btn_nba_1').html();
    		if (dealer_links_ul_tmp != null) {
    			dealer_links_ul = dealer_links_ul_tmp;
    		}
    		if (dealer_links_tmp != null) {
    			dealer_links = dealer_links_tmp;
    		}
    		
    		if (dealer_links_ul != null) 
    		var dealer_links = dealer_links_ul + " " + dealer_links;
    		
			var marker = gMap_createMarker(new GLatLng(latitude, longitude), dealer_no + "." + dealer_address + "" + dealer_links, google_map_markerIcon);
			
			if (i == 0) {
				google_map_markers[pageNumber] = new Array();
			}
			else if (i%google_map_dealerPerPage == 0) {
				pageNumber++;
				google_map_markers[pageNumber] = new Array();
			}
			google_map_markers[pageNumber].push(marker);

			if (i == 0) {
				google_map_center = new GLatLng(latitude, longitude);
			}
    	});
	}
}

function gMap_createMarker(point,html,icon) {
	var marker;
	if (icon) {
		marker = new GMarker(point, {icon:icon});
	} else {
		marker = new GMarker(point);
	}
	GEvent.addListener(marker, "mouseover",	function() { marker.openInfoWindowHtml(html);});
	return marker;
}

function gMap_panToCurrentDealer () {	
	google_map_object.savePosition();
	var dealersMarker = gMap_getMarkerForDealer(google_map_dealerId);
	
	if (dealersMarker != null) {
		google_map_center = dealersMarker.getLatLng();
		google_map_object.panTo(google_map_center, 10);
	}
}

function gMap_hideDealersExceptForCurrent() {
	if (window.paging_current_from && paging_current_from != null && paging_current_to != null) {
		var markers = google_map_markers[google_map_currentpage];
		for(var i = 0; i < markers.length; i++) {
			markers[i].hide();
		}
		gMap_getMarkerForDealer(google_map_dealerId).show();
	}	
}

function gMap_getMarkerForDealer(dealerId) {
	var markersPagePosition = (dealerId-1) - (google_map_currentpage * google_map_dealerPerPage);
	return google_map_markers[google_map_currentpage][markersPagePosition];
}

function gMap_setAllMarkersOnMap() {
	if (typeof(google_map_markers) != 'undefined' && typeof(google_map_markers[0]) != 'undefined') {
		//google_map_object.clearOverlays();
		for (var index = 0; index < google_map_markers.length; index++) {
			var markersize = google_map_markers[index].length;
			for(var i = 0; i < markersize; i++) {
				var tmp_marker = google_map_markers[index][i];
				//mapUtil.calculateBorders(tmp_marker.getLatLng());
				google_map_object.addOverlay(tmp_marker);
				tmp_marker.hide();
			}
		}
		//mapUtil.zoomToViewAll();
	}
}

function gMap_HideMarkersOfPage(page) {
	if (page != null && typeof(page) != 'undefined') {
		if (typeof(google_map_markers) != 'undefined' && typeof(google_map_markers[page]) != 'undefined') {
			var markersize = google_map_markers[page].length;
			for(var i = 0; i < markersize; i++) {
				var tmp_marker = google_map_markers[page][i];
				tmp_marker.hide();
			}
		}
	}
}

function gMap_showMarkersOfPage(old_page, new_page) {
	gMap_HideMarkersOfPage(old_page);
	if (!new_page) {
		new_page=0;
	}
	if (typeof(google_map_markers) != 'undefined' && typeof(google_map_markers[new_page]) != 'undefined') {
		var markersize = google_map_markers[new_page].length;
		log.debug("Map - 	Putting " + markersize + " markers on map. Paging number: " + new_page);
		
		for(var i = 0; i < markersize; i++) {
			var tmp_marker = google_map_markers[new_page][i];
			mapUtil.calculateBorders(tmp_marker.getLatLng());
			tmp_marker.show();
		}
		mapUtil.zoomToViewAll();
	}
}

function gMap_hideMarker(dealerId) {
	log.debug("Map - 	Hiding marker " + dealerId);
	var marker = gMap_getMarkerForDealer(dealerId);
	if (marker != null) {
		marker.hide();
	}
}

function gMap_showMarker(dealerId) {
	log.debug("Map - 	Showing marker " + dealerId);
	var marker = gMap_getMarkerForDealer(dealerId);
	if (marker != null) {
		marker.show();
	}
}

function do_showOrHideMarker(markerId) {
    if (mrm.$("#range" + markerId).prop('checked')) {
       gMap_showMarker(markerId);
    }
    else {
        gMap_hideMarker(markerId);
    }
}


// Util for setting maps zoom level

var mapUtil = {
	
	minLat: null,
	maxLat: null,
	minLng: null,
	maxLng: null,
	minZoom: 3,
	
	calculateBorders: function(gmap_gLatLng) {
		
		latitude = Number(gmap_gLatLng.lat());
		longitude = Number(gmap_gLatLng.lng());
		if(typeof(latitude) == 'number' && typeof(longitude) == 'number') {
			if(mapUtil.minLat == null || mapUtil.minLat > latitude) {
				mapUtil.minLat = latitude;
			}
	
			if(mapUtil.maxLat == null || mapUtil.maxLat < latitude) {
				mapUtil.maxLat = latitude;
			}
		
			if(mapUtil.minLng == null || mapUtil.minLng > longitude) {
				mapUtil.minLng = longitude;
			}
			
			if(mapUtil.maxLng == null || mapUtil.maxLng < longitude) {
				mapUtil.maxLng = longitude;
			}
		}
	},
	
	zoomToViewAll: function() {
		var visibleBounds = mapUtil.getVisibleBounds();
		if(visibleBounds) {
			var boundsCentre = visibleBounds.getCenter();
			var zoomLevel = google_map_object.getBoundsZoomLevel(visibleBounds);
			if (zoomLevel < mapUtil.minZoom) {
				google_map_object.setCenter(boundsCentre, mapUtil.minZoom);
			}
			else if(zoomLevel < 15 ) {
				google_map_object.setCenter(boundsCentre, zoomLevel);
			}
			else {
				google_map_object.setCenter(boundsCentre, 15);
			}
		}
		mapUtil.minLat = null;
		mapUtil.maxLat = null;
		mapUtil.minLng = null;
		mapUtil.maxLng = null;
	},
	
	getVisibleBounds: function() {
		if(mapUtil.maxLng) {
			var swLatLng = new GLatLng(mapUtil.minLat-0.1, mapUtil.minLng-0.1);
			var neLatLng = new GLatLng(mapUtil.maxLat+0.1, mapUtil.maxLng+0.1);
			var minBounds = new GLatLngBounds(swLatLng, neLatLng);
			return minBounds;
		}
		return null;
	}
}

