// Some globals
var map = null;	// GMap2 map object
var geocoder = null;	// GClientGeocoder
var marker = null;	// Marker for search address
var searchaddress = null;	// Text string of search address
var searchdealers = null;	// list of dealers to be displayed
var sampleAddress = 'Straße, PLZ Ort';	// Beispieladresse vorausgefüllt
var gdir = null;	// GDirections for display
var baseIcon = null;	// Base icon for dealer markers
var dealerList = {};
var displayedDealer = null;	// Number of the dealer currently selected
var routedDealer = null;	// Number of the dealer currently internally routed
var contextmenu;	// To remember the position of the right click
var clickedPixel;	// To remember the position of the right click
var initial_dealer = null; // Initially select this dealer

//function initGoogleMap(init_searchaddress, init_lat, init_lon, init_dealer,elementID, search_model, search_body) {
//    mapsLoaded(init_searchaddress, init_lat, init_lon, init_dealer,elementID, search_model, search_body);
//}


function mapsLoaded(init_searchaddress, init_lat, init_lon, init_dealer,elementID, search_model, search_body) {
//function initGoogleMap(init_searchaddress, init_lat, init_lon, init_dealer) {

	if (google.maps.BrowserIsCompatible()) {
		// Create google map
		if (elementID==null) elementID="map_canvas";
		e= document.getElementById(elementID)
		map = new google.maps.Map2(e);

		map.enableScrollWheelZoom();
		if( google.loader.ClientLocation) {
			map.setCenter(new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude), 11);	// Germany
			if( google.loader.ClientLocation.city)
				document.getElementById('searchaddressfield').value = google.loader.ClientLocation.city;
		}
		else
			map.setCenter(new google.maps.LatLng(51, 9), 5);	// Germany
		map.addControl(new google.maps.SmallMapControl());	// Slider and Zoom
		map.addControl(new google.maps.MenuMapTypeControl());	// Map type chooser
		google.maps.Event.addListener(map, "singlerightclick", mapSingleRightClick); // Show context menu on right click
		google.maps.Event.addListener(map, "click", function() { contextmenu.style.visibility="hidden"; }); // Close if clicked somewhere else

		// create the context menu for right click
		contextmenu = document.createElement("div");
		contextmenu.style.visibility="hidden";
		contextmenu.style.background="#ffffff";
		contextmenu.style.border="1px solid #18296e";
		contextmenu.innerHTML = '<a href="javascript:rightClickSearchHere()"><div class="context">&nbsp;&nbsp;Hier suchen&nbsp;&nbsp;</div></a>';
		map.getContainer().appendChild(contextmenu);

		// Geocoder for address resolution
		geocoder = new google.maps.ClientGeocoder();
		geocoder.setBaseCountryCode('DE');

		// Route planner
		gdir = new google.maps.Directions(map, document.getElementById("drivingdirections"));
		google.maps.Event.addListener(gdir, "load", displayRouteCalculationFinished);
		google.maps.Event.addListener(gdir, "error", displayRouteCalculationError);

		// Base icon for numbered dealer markers
		baseIcon = new google.maps.Icon(G_DEFAULT_ICON);
		baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
		baseIcon.iconSize = new google.maps.Size(20, 34);
		baseIcon.shadowSize = new google.maps.Size(37, 34);
		baseIcon.iconAnchor = new google.maps.Point(9, 34);
		baseIcon.infoWindowAnchor = new google.maps.Point(9, 2);

		if( init_dealer)
			initial_dealer = init_dealer;
		if( init_searchaddress) {

			// Start using given address
			searchaddress = init_searchaddress;
			if( init_lat && init_lon) {
				if(elementID=='map_canvas_offer')  {
					searchLocationsNear( new GLatLng( init_lat, init_lon),'_offer', search_model, search_body);
				} else {
					searchLocationsNear( new GLatLng( init_lat, init_lon, null, search_model, search_body));
				}
			} else {
				if(elementID=='map_canvas_offer')  {
					startSearch( searchaddress,'_offer', search_model, search_body);
				} else {
					startSearch( searchaddress, null, search_model, search_body);
				}



			}
		} else if( google.loader.ClientLocation) {


			// Start search if GeoIP resolution successful
			searchaddress = google.loader.ClientLocation.latitude+', '+google.loader.ClientLocation.longitude;
			searchLocationsNear( new GLatLng( google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude), null, search_model, search_body);
		} else if( searchdealers) {

			searchLocationsNear(null, null, search_model, search_body);
			// Enable Print Overview button
			document.getElementById('mapactionoverviewprint').style.display="block";
			document.getElementById('mapactionoverviewprint').firstChild.href="/pages/beratung/haendlersuche/suchergebnis_drucken.html?dealer_id="+searchdealers;
		}

	}
}

	// Callback for triggering address search
function startSearch(address,target, search_model, search_body) {

	if( ! geocoder) return;
	if( address == '') return;
	if( address == 'Straße 123, 45678 Ort') return;
	geocoder.getLocations(
		address,
		function(result) {
			var ret = '';
			var numresults = 0;
			if( result.Placemark) {
				for( i = 0; i < result.Placemark.size(); i++) {	// Mögliche Varianten als Auswahlergebnis auflisten
					if( result.Placemark[i]) {
						// bbox testen, Ausland weglassen
						if( result.Placemark[i].Point.coordinates[0] > 5.6 &&
						    result.Placemark[i].Point.coordinates[0] < 15.1 &&
						    result.Placemark[i].Point.coordinates[1] > 47.2 &&
						    result.Placemark[i].Point.coordinates[1] < 55.2 )
						{
							ret += '<a href="javascript:searchLocationsNearCoord('+result.Placemark[i].Point.coordinates[1]+', '+result.Placemark[i].Point.coordinates[0]+',\''+result.Placemark[i].address+'\', '+ search_model +', '+ search_body +');">'+result.Placemark[i].address+'</a /><br />';
							numresults++;
						}
					}
				}
			}

			map.clearOverlays();	// Clear old search result
			dealerList = {};
			routedDealer = null;
			displayedDealer = false;
			gdir.clear();
			document.getElementById('mapactionoverviewback').style.display="none";
			document.getElementById('mapactionoverviewprint').style.display="none";
			document.getElementById('mapactiondetailprint').style.display="none";
			document.getElementById('mapactionacceptdealer').style.display="none";

			// Multiple possible matches: Show chooser list
			if( numresults > 1) {
				map.setCenter(new google.maps.LatLng(51, 9), 5);	// Germany
				if(target==null) target = '';
				document.getElementById('searchresult'+target).innerHTML = '<b>Meinten Sie</p>:<br />'+ret+'<div style=\'margin-bottom:25px;\'></div>';
				document.getElementById('usedsearchaddress'+target).innerHTML = 'Diese Angabe hat mehrere Varianten';

			// One result: start dealer search
			} else if( numresults > 0) {
				var place = result.Placemark[0];
				var point = new GLatLng(place.Point.coordinates[1],
							place.Point.coordinates[0]);
				map.setCenter(point, 10);
				if( result.Placemark[0].address)
					searchaddress = result.Placemark[0].address;
				else
					searchaddress = address;

				if(target==null) target = '';
				document.getElementById('usedsearchaddress'+target).innerHTML = '<p>Zur Routenplanung verwendet: "'+searchaddress+'".</p>';
				searchLocationsNear(point,target, search_model, search_body);

			// Address not found: display error
			} else {
				if(target==null) target = '';
				map.setCenter(new google.maps.LatLng(51, 9), 5);	// Germany

				document.getElementById('searchresult'+ target).innerHTML = '<p>Die angegebene Adresse <em>"'+address+'"</em> wurde nicht gefunden!<br />Bitte korrigieren Sie Ihre Adresseingabe.</p>';
				//alert('Die angegebene Adresse\n\n"'+address+'"\n\nwurde nicht gefunden!\n\nBitte korrigieren Sie Ihre Adresseingabe.');
			}
		}
	);
}

function _RouteTo( dealerno, router) {
	var ddata = dealerList[dealerno];
	var fromaddress = searchaddress;
	if( fromaddress == "") return;
	var toaddress = ddata['lat']+' '+ddata['lon'];
	var routestring = "from: " + fromaddress + " to: " + toaddress;
	router.load( routestring, { "locale": "DE" });
}
function RouteTo( dealerno) {
	if( dealerno == routedDealer)	// Dont route the same dealer multiple times
		return;
	routedDealer = dealerno;
	_RouteTo( dealerno, gdir);
}

function displayRouteCalculationError() {
   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	 alert("Der Routenplaner konnte die angegebene Adresse nicht finden. Sie ist möglicherweise zu neu, oder fehlerhaft angegeben.\nFehlercode: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	 alert("Der Aufruf des Routenplaners ist fehlgeschlagen. Versuchen Sie es bitte zu einem späteren Zeitpunkt erneut.\nFehlercode: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	 alert("Beim Aufruf des Routenplaners wurde keine Adresse übergeben.\nFehlercode: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_UNKNOWN_DIRECTIONS)
	 alert("Es wurde keine Route gefunden. Möglicherweise existiert kein Weg zwischen den beiden Punkten, oder die Daten für die Region sind unvollständig.\n Error code: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	 alert("Der Google-API-Lizenzschlüssel ist ungültig.\nFehlercode: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	 alert("Beim Aufruf des Routenplaners ist ein interner Fehler aufgetreten.\nFehlercode: " + gdir.getStatus().code);

   else alert("An unknown error occurred.\nERROR:"+gdir.getStatus().code);
}
function displayRouteCalculationFinished() {
	// Enable Print Directions button
	document.getElementById('mapactiondetailprint').style.display="block";
	document.getElementById('mapactiondetailprint').firstChild.href="/pages/beratung/haendlersuche/wegbeschreibung_drucken.html?start="+escape(searchaddress)+"&dealer_id="+displayedDealer;
	document.getElementById('mapactionacceptdealer').style.display="block";
	document.getElementById('mapactionacceptdealer').setAttribute('dealerid',displayedDealer);
	document.getElementById('mapactionacceptdealer').setAttribute('lat',dealerList[displayedDealer]['lat']);
	document.getElementById('mapactionacceptdealer').setAttribute('lon',dealerList[displayedDealer]['lon']);
	document.getElementById('mapactionacceptdealer').setAttribute('searchaddress',searchaddress);
}

function getHtmlForMarker( data) {
	var html = '';
	html += '<div><b>'+data['nameoneline']+'</b></p>';
	html += '<p>'+data['street'];
	html += '<br />'+data['zipcode'];
	html += ' '+data['city'];
	html += '<br />'+data['phone'];
	if( data['haendlersite'])
		html += '<br /><a href="http://'+data['haendlersite']+'/" target="_blank">'+data['haendlersite']+'</a>';
	if( searchaddress)
		html += '<br /><br /><a href="#" onclick="highlightDealer('+data['id']+');RouteTo('+data['id']+');return false;">Route anzeigen</a>';
	html += '</div>';

	return html;
}

function highlightDealer( dealerno) {
	displayedDealer = dealerno;
	for( d in dealerList) {
		document.getElementById('dealer'+dealerList[d]['id']+'detailslarge').style.display = 'none';
		document.getElementById('dealer'+dealerList[d]['id']+'detailssmall').style.display = 'block';
		document.getElementById('dealerresult'+dealerList[d]['id']).className = 'otherdealer';
	}
	if( dealerno) {
		document.getElementById('dealer'+dealerno+'detailslarge').style.display = 'block';
		document.getElementById('dealer'+dealerno+'detailssmall').style.display = 'none';
		document.getElementById('dealerresult'+dealerno).className = 'currentdealer';
		document.getElementById('mapactionacceptdealer').style.display="block";
		document.getElementById('mapactionacceptdealer').setAttribute('dealerid',dealerno);
		document.getElementById('mapactionacceptdealer').setAttribute('lat',dealerList[dealerno]['lat']);
		document.getElementById('mapactionacceptdealer').setAttribute('lon',dealerList[dealerno]['lon']);
		document.getElementById('mapactionacceptdealer').setAttribute('searchaddress',searchaddress);
	}
}

function formatDealerListEntry( marker, data, center) {
	var div = document.createElement('div');
	div.id = 'dealerresult'+data['id'];

	var html_small = data['zipcode']+' '+data['city'];

	var html_full = data['street']+'<br />';
	html_full += data['zipcode']+' '+data['city']+'<br />';
	html_full += data['phone']+'<br />';
	if( data['haendlersite'])
		html_full += '<a href="http://'+data['haendlersite']+'/" target="_blank">'+data['haendlersite']+'</a><br />';

	var html = '<img src="'+data['icon_image']+'" style="float:left;margin-right:4px;">';

	html += '<div style="float:left;width:168px;">';
	html += '<b>' + data['nameoneline'] + '</b>';
	html += '<div id="dealer'+data['id']+'detailssmall" style="display:block;">'+html_small+'</div>';
	html += '<div id="dealer'+data['id']+'detailslarge" style="display:none;">'+html_full+'</div>';
	html += '</div>';

	html += '<br clear="all" />';

	div.innerHTML = html;
	div.style.cursor = 'pointer';
	div.style.marginBottom = '5px';
	div.className = 'otherdealer';
	//div.style.border = '1px solid #ccc;'; // Tut nicht im IE

	// Open marker on click
	GEvent.addDomListener(div, 'click', function() {
		GEvent.trigger(marker, 'click');
		highlightDealer( data['id']);
		if( center)
			RouteTo( data['id']);
	});

	// Highlight on mouseover
	GEvent.addDomListener(div, 'mouseover', function() {
		if( div.className == 'otherdealer')
			div.className = 'otherdealermo';
	});
	GEvent.addDomListener(div, 'mouseout', function() {
		if( div.className == 'otherdealermo')
			div.className = 'otherdealer';
	});

	return div;
}

// Fetch nearby dealers using AJAX
function searchLocationsNear(center,target, search_model, search_body) {

	var searchUrl = '/_ajax/haendlersuche.php?search_target=sales';
	if( center) {
		searchUrl += '&lat=' + center.lat() + '&lon=' + center.lng();
		if( searchdealers) {
			searchUrl += '&dealers='+searchdealers;
		}
	} else if( searchdealers) {
		searchUrl += '?dealers='+searchdealers;
	}

    if (search_model) {
        searchUrl += '&search_model='+ search_model;

        if (search_body) {
            searchUrl += '/body/'+ search_body;
        }
    }

//    alert(target);

	google.maps.DownloadUrl(
		searchUrl,
		function(xmldata) {
			map.clearOverlays();	// Clear old search result
			dealerList = {};
			routedDealer = null;
			document.getElementById('mapactionoverviewback').style.display="block";
			// Hide Print Directions button
			document.getElementById('mapactiondetailprint').style.display="none";
			document.getElementById('mapactionacceptdealer').style.display="none";


			if( center) {
				marker = new google.maps.Marker(center);
				marker.bindInfoWindowHtml(searchaddress);
				map.addOverlay(marker);
			}

			var xml = google.maps.Xml.parse(xmldata);
			var markers = xml.documentElement.getElementsByTagName('marker');
			if(target==null) target = '';
			var sidebar = document.getElementById('searchresult'+target);
			sidebar.innerHTML = '';
			if (markers.length == 0) {
			  sidebar.innerHTML = 'Keine Händler gefunden.';
			  map.setCenter(new google.maps.LatLng(51, 9), 5);
			  return;
			}

			var bounds = new google.maps.LatLngBounds();
			var dealeridlist = new Array();
			for (var i = 0; i < markers.length; i++) {
				// fetch data for dealer
				dealeridlist.push(markers[i].getAttribute('id'));
				var data = {};
				data['idx'] = i;
				data['letter'] = String.fromCharCode("A".charCodeAt(0) + i);
				data['id'] = markers[i].getAttribute('id');
				data['name1'] = markers[i].getAttribute('name1');
				data['name2'] = markers[i].getAttribute('name2');
				data['name3'] = markers[i].getAttribute('name3');
				data['nameoneline'] = data['name1'];
				data['namemultiline'] = data['name1'];
				if( data['name2']) {
					data['nameoneline'] += ' '+data['name2'];
					data['namemultiline'] += '<br />'+data['name2'];
				}
				if( data['name3']) {
					data['nameoneline'] += ' '+data['name3'];
					data['namemultiline'] += '<br />'+data['name3'];
				}
				data['street'] = markers[i].getAttribute('street');
				data['zipcode'] = markers[i].getAttribute('zipcode');
				data['city'] = markers[i].getAttribute('city');
				data['url_int'] = markers[i].getAttribute('url_int');
				data['url_int_accept'] = markers[i].getAttribute('url_int_accept');
				data['haendlersite'] = markers[i].getAttribute('haendlersite');
				data['phone'] = markers[i].getAttribute('phone');
				data['type'] = markers[i].getAttribute('type');
				data['distance'] = parseFloat(markers[i].getAttribute('distance'));
				data['lat'] = parseFloat(markers[i].getAttribute('lat'));
				data['lon'] = parseFloat(markers[i].getAttribute('lon'));
				data['point'] = new GLatLng( data['lat'], data['lon']);

				// Create marker
				var letteredIcon = new google.maps.Icon(baseIcon);
				data['icon_image'] = "http://www.google.com/mapfiles/marker" + data['letter'] + ".png";
				letteredIcon.image = data['icon_image'];
				markerOptions = { icon:letteredIcon,dealerid:markers[i].getAttribute('id')};
				var m = new google.maps.Marker(data['point'], letteredIcon);
				var mhtml = getHtmlForMarker(data);
				m.bindInfoWindowHtml( mhtml);
				map.addOverlay(m);

				google.maps.Event.addListener(m, "click", dealerMarkerClicked);

				// Add dealer to search result list
				var sidebarEntry = formatDealerListEntry( m, data, center);
				sidebar.appendChild(sidebarEntry);
				dealerList[data['id']] = data;

				// Extent bounds for map zoom
				bounds.extend(data['point']);
			}
			if( markers.length == 1) {
				// exactly one dealer was found: expand node and display route
				highlightDealer( markers[0].getAttribute('id'));
				if( center)
					RouteTo( markers[0].getAttribute('id'));
			}

			// Enavle Print Overview button
			if( center) {
				document.getElementById('mapactionoverviewprint').style.display="block";
				document.getElementById('mapactionoverviewprint').firstChild.href="/pages/beratung/haendlersuche/suchergebnis_drucken.html?lat="+center.lat()+"&lon="+center.lng()+"&dealer_id="+dealeridlist.join(',');
			}

			var div = document.createElement('div');
			div.style.marginBottom = '25px';
			sidebar.appendChild(div);
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			/*if( center) {
				for( d in dealerList) {
					internalRouteTo( d);
					break;
				}
			}*/
			if( initial_dealer) {
				displayedDealer = initial_dealer;
				highlightDealer( initial_dealer);
				RouteTo( initial_dealer);
			}


            if ($('omd_confirmation_pixel_dsearch')) {
                // Advertiser 'Gfmo Omd Ges Fuer Media-Optimierung MBH / Hyundai Motor Deutschland GMBH',  Conversion tracking 'Gfmo Omd Ges Fuer Media-Optimierung MBH / Hyundai Motor Deutschland GMBH_Haendlersuche_Confirmation' - DO NOT MODIFY THIS PIXEL IN ANY WAY -->
                $('omd_confirmation_pixel_dsearch').src = 'http://ads.bluelithium.com/pixel?id=1217428&t=2';
                // End of conversion tag -->
            }
		}
	);
}
function searchLocationsNearCoord(lat,lng,address, search_model, search_body) {
	displayedDealer = false;
	gdir.clear();
	var pos = new GLatLng( lat ,lng);
	map.setCenter(pos, 10);
	searchaddress = address;
	searchLocationsNear( pos, null, search_model, search_body);
	contextmenu.style.visibility="hidden";


}
function returnToOverview() {
	// Close current route
	routedDealer = null;
	highlightDealer( false);
	map.closeInfoWindow();
	gdir.clear();

	// Extent bounds for map zoom
	var bounds = new google.maps.LatLngBounds();
	for( d in dealerList) {
		bounds.extend(dealerList[d]['point']);
	}
	// Zoom to bounds
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));

	// Hide Print Directions button
	document.getElementById('mapactiondetailprint').style.display="none";
	document.getElementById('mapactionacceptdealer').style.display="none";
}

function mapSingleRightClick(pixel, src, overlay) {
	// store the "pixel" info in case we need it later
	// adjust the context menu location if near an egde
	// create a GControlPosition
	// apply it to the context menu, and make the context menu visible
	clickedPixel = pixel;
	var x=pixel.x;
	var y=pixel.y;
	if (x > map.getSize().width - 120) { x = map.getSize().width - 120 }
	if (y > map.getSize().height - 100) { y = map.getSize().height - 100 }
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));
	pos.apply(contextmenu);
	contextmenu.style.visibility = "visible";
}

function rightClickSearchHere() {
	var pos = map.fromContainerPixelToLatLng(clickedPixel);
	displayedDealer = false;
	gdir.clear();
	map.setCenter(pos, 10);
	searchaddress = pos.lat()+' '+pos.lng();
	searchLocationsNear(pos, null, search_model, search_body);
	contextmenu.style.visibility="hidden";
}

function dealerMarkerClicked( pos) {
	if( pos && pos.lat) {
		for( d in dealerList) {
			if( pos.lat() == dealerList[d]['lat'] && pos.lng() == dealerList[d]['lon']) {
				highlightDealer( d);
				if( routedDealer != d) {
					document.getElementById('mapactiondetailprint').style.display="none";
					gdir.clear();
				}
				break;
			}
		}
	}
}

