/*
 * sites.js - created: 12.2006 (mj)
 * © 2006 xmachina GmbH, Heidelberg.
 * All rights reserved. Alle Rechte vorbehalten.
 *
 * xmachina und das xmachina-Logo sind eingetragene
 * Warenzeichen der xmachina GmbH, Heidelberg.
 *
 * xmachina and the xmachina logo are registered
 * trademarks of xmachina GmbH, Heidelberg, Gemany.
 *
 * xmachina GmbH - Maaßstr. 24 - D-69123 Heidelberg, Germany
 * Fon: +49 (0)6221.8220.20    - Fax: +49 (0)6221.8220.40
 * E-Mail: deus@xmachina.de    - http://www.xmachina.de/
 * 
 */

// Get path prefix from HDC page
// usage: var xmScriptPathPrefix = "your favourite URL here/";
var pathPrefix = (window.xmScriptPathPrefix)? window.xmScriptPathPrefix:"";

// Globals & config
var defaultZoom = 8;
var map;
var baseIcon;
var geoLocationServiceURL = pathPrefix + "geoLocationProvider.aspx";
var addressProvider = pathPrefix + "addressProvider.aspx";
var markerIcon = pathPrefix + "resources/images/hdc-pin.png";;
var bCtrlPanelVisible = true;
var markers;
var mix = 0;
var maxMarkers = 30;
var centerPoint = new GLatLng(49.395893, 8.644524); 

// Register event observer
Event.observe(window, 'load', load);
Event.observe(window, 'unload', unLoad);

// (Page load) Loads the map   
function load() {   
    checkBrowser();
    
	if (GBrowserIsCompatible()) {
    	map = new GMap2($("map"));
    
        map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
        
        map.setCenter(centerPoint, defaultZoom);			
		
		GEvent.addListener(map, "moveend", clearAddressList);


		// Create a base icon for all of our markers that specifies the
		// shadow, icon dimensions, etc.
		baseIcon = new GIcon();
		baseIcon.iconSize = new GSize(35, 33);
		baseIcon.iconAnchor = new GPoint(9, 34);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
				
		// Initializes the form		
		var param = getParameter();
		if (checkBeton()) {
		    param = buildQueryString();
		} else if (param == null || param == "") {
		    param = "?types=Konzernzentrale";
		    setEnabled('divisions', true);
		}
		param = initializeForm(param);
						
		// Load the initial markers from db
		//loadMarkers(param);	                    // already called by initializeForm(param) 
		
		//setTimeout("renderAddressList()", 10000); // already called by initializeForm(param) 
		
	} else {
	  	alert("Ihr Browser unterstützt GoogleMaps nicht.");
	}
		
} 

//
function checkBeton(){
    var beton = document.getElementById("app");
    if (beton != null && beton.value == "beton") {
        return true;
	}
	return false;
}

// Make page state persistent
function unLoad() {
    var tmp = document.location.search;
    if (tmp == null || tmp == "")
        tmp = "na";
    document.cookie = "xmSrcSearch=" + tmp;
    document.cookie = "xmTargetSearch=" +  buildQueryString();
}

// Decides whether to get parameters from url or from cookie
function getParameter() {
    var param = document.location.search;
    var xmSrcSearch = GetCookie('xmSrcSearch');
    var xmTargetSearch = GetCookie('xmTargetSearch');
    
    // Load cookie
    if (xmSrcSearch != null && xmTargetSearch != null) {
        if (param == xmSrcSearch)
            param = decodeURI(xmTargetSearch);
    }
        
    return param;
}

// Returns the value of a cookie parameter
function getCookieVal (offset) {
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
        endstr = document.cookie.length;
    var ret = document.cookie.substring(offset, endstr);
    if (ret == "na") ret = "";
    return ret;
}

// Returns a cookie
function GetCookie (name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
        return getCookieVal (j);
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break; 
    }
    return null;
}


// For faster browsers increase the maxMarkers size
function checkBrowser() {
    var agent = navigator.userAgent.toLowerCase();
    
    if (agent.indexOf('msie 7.') != -1 || agent.indexOf('gecko') != -1)
        maxMarkers = 500;
    
    //document.getElementById("devOutput").innerHTML = "Für " + navigator.userAgent.toLowerCase() + " wurden max " + maxMarkers + " Markers festgelegt";
 }

// Initialize form
function initializeForm(querystring) {	
	// Check selections	
	checkFromRequestParameter(querystring, 'divisions');
	checkFromRequestParameter(querystring, 'types');
	
	// Need to set an other center
	var liste = new Werteliste(querystring);
	if (liste['plz'] != null) {
		centerMap(liste['plz']);
		$('plz').value = liste['plz'];
	}
	return querystring;
}

// Returns property value pairs for the request parameters
function Werteliste(querystring) {
    if(querystring == '') 
        return;
    
    var wertestring = decodeURI(querystring);
    wertestring = wertestring.slice(1);
    var paare = wertestring.split("&");
    for (var i=0; i < paare.length; i++) {
        var name = paare[i].substring(0, paare[i].indexOf("="));
        var wert = paare[i].substring(paare[i].indexOf("=")+1, paare[i].length);
        this[name] = wert;
    }
}

// Checks all instances of el that match the query string
function checkFromRequestParameter(querystring, el) {
	var instances = document.getElementsByName(el);
    for (var i=0; i<instances.length; i++) {
		instances[i].checked = (querystring.indexOf(el + '=' + encodeURIComponent(instances[i].value)) > -1);
	}
}

// Loads the markers from database
function loadMarkers(params) {
	if (params == null)
		params = "";
		
	var request = GXmlHttp.create();
	request.open('GET', geoLocationServiceURL + params, true);
	request.onreadystatechange = function() {
  		if (request.readyState == 4) {
			var xmlDoc = request.responseXML;
			markers = xmlDoc.documentElement.getElementsByTagName("marker");
			
			// Start 'thread' to set markers asynchronously
			mix = 0;
			setMarkers();
  		}
	}
	request.send(null);
}

// worker 'thread' to set markers on the map
function setMarkers() {
    if (markers != null && markers[mix] != null) {
  	    var point = new GPoint(parseFloat(markers[mix].getAttribute("lng")),
  	        parseFloat(markers[mix].getAttribute("lat")));
  				   
  		map.addOverlay(createMarker(point, markers[mix].getAttribute("id"),
		    markers[mix].getAttribute("address"), parseFloat(markers[mix].getAttribute("lat")),
  	        parseFloat(markers[mix].getAttribute("lng"))));
				    				
		mix++;
	}
	
	if (markers != null && mix < markers.length && mix < maxMarkers)
	    setTimeout("setMarkers()", 1);
}

// Creates a marker at the given point with the given number label
function createMarker(point, id, address, lat, lng) {
	var icon = new GIcon(baseIcon);
  	icon.image = markerIcon;
 	
  	var marker = new GMarker(point, icon);

  	GEvent.addListener(marker, "click", function() {
  	    
		$('address').innerHTML="laden ...";
		
	    var pars = buildQueryString() + '&markerid=' + id;
        
        var request = GXmlHttp.create();
        request.open("GET", addressProvider + pars, false);
        request.send(null);
        var htmlDoc = request.responseText;
        document.getElementById("address").innerHTML = htmlDoc;

        var clickAction = "map.closeInfoWindow(); map.panTo(new GLatLng(" + lat + "," + lng + ")); $('applicationView').scrollIntoView(true);";

        //taenzerg        
        var center = "<a href=\"#\" onclick=\"" + clickAction + "\">Karte auf diesen Standort zentrieren</a>";
		var navi = "<a target=\"_blank\" href=\"http://maps.google.de/maps?f=d&hl=de&q=" + address + "\">Route berechnen</a>";
		
    	    	
    	marker.openInfoWindowHtml("<div style='width:300px;height:164px;overflow:auto;font-size=9pt;border-bottom:1px solid gray;'>" + document.getElementById("address").innerHTML + "</div>"
    	+ "<span class=\"smalltext\">" + center + " | " + navi + "</span>"); //taenzerg
  	});
		
  	return marker;
}
	
	
// Centers the map on the given geo location
function centerMap(location) {
	if (location == null || location == "")
			return;
	
	var address = location + ", Germany";
	var geocoder = new GClientGeocoder();
	
	geocoder.getLatLng(
    	address,
    	function(point) {
      		if (!point) {
        		alert(address + " nicht gefunden.");
      		} else {
        		map.setCenter(point, defaultZoom);
        		centerPoint = point;
      		}
    	}
  	);
  	
  	// Clear visible addresses
  	$('addressList').innerHTML = "";
  	$('address').innerHTML = "";
  	
  	setTimeout("updateMap()", 1000);
}

// Updates the marker on the map depending on the current selection
function updateMap() {    
	// Reset markers
	markers = null;
	
	// Clear Map
	map.clearOverlays();
	
	// Clear address list
	$('addressList').innerHTML = "";
		
	// Build query string
	var params = buildQueryString();
				
	// Load data
	loadMarkers(params);
	
	setTimeout("renderAddressList()", 2000);
}

// Build the request parameters for this page state
function buildQueryString() {
	var params = "?";
	var types = document.getElementsByName("types");
	for (var i=0; i<types.length; i++) {
		if (types[i].checked)
			params+= "types=" + encodeURIComponent(types[i].value) + "&";
	}
	
	var divisions = document.getElementsByName("divisions");
	for (i=0; i<divisions.length; i++) {
		if (divisions[i].checked && !divisions[i].disabled)
			params+= "divisions=" + encodeURIComponent(divisions[i].value) + "&";
	}
	
	params+= "plz=" + encodeURIComponent($('plz').value);
	
	//centerPoint
	params += "&lat=" + centerPoint.lat();
	params += "&lng=" + centerPoint.lng();
	
	//alert("Params >" + params + "<");
	
	return params;
}

function checkAll(element) {
	if ($('checkall').checked)
		selectAll(element);
	else
		selectNone(element);
}


// Checks all elements with the given name
function selectAll(element) {
    var instances = document.getElementsByName(element);
    for (var i=0; i<instances.length; i++)
		instances[i].checked = true;
		
	updateMap();
}

// Unchecks all elements with the given name
function selectNone(element) {
    var instances = document.getElementsByName(element);
    for (var i=0; i<instances.length; i++)
		instances[i].checked = false;
		
	updateMap();
}

// Enables all elements with the given name
function setEnabled(element, state) {
	var instances = document.getElementsByName(element);
    for (var i=0; i<instances.length; i++)
		instances[i].disabled = state;
}

// Called if the current selection has been changed (not for services)
function selectionChanged() {
	setEnabled('divisions', false);
  	updateMap();
}

// Selects a service / dienstleistung
function selectDl() {
	setEnabled('divisions', true);
	selectNone('divisions'); //taenzerg
	//updateMap();
}

// Toggles the visibility of the control panel
function togglePanel() {
	if (bCtrlPanelVisible) {
		Effect.BlindUp('controlPanel');
		bCtrlPanelVisible = false;
		$('controlPanelSwitch').innerHTML = "einblenden";
	} else {
		Effect.BlindDown('controlPanel');
		bCtrlPanelVisible = true;
		$('controlPanelSwitch').innerHTML = "ausblenden";
	}
}

function showDevPanel() {
	Effect.BlindDown('devPanel');
}

// Generates a link to the current page
function generateLink() {
	var targetUrl = window.location.href;
	var ix = targetUrl.indexOf('?');
	if (ix > -1)
		targetUrl = targetUrl.substring(0, ix);
		
	var params = targetUrl + buildQueryString();
	$('devOutput').innerHTML = params;
}

// Event handler of the map`s move event
function clearAddressList() {
   $('addressList').innerHTML = "";
   $('addressListMessage').innerHTML = "";
   $('addressListUpdater').style.display = "block";
}

// Renders the list of nearest sites
function renderAddressList() {        
    var tmp = "";
    var addressList = $('addressList');
    var addressListMessage = $('addressListMessage');
    var url = addressProvider;
     
    // Clear content
    addressList.innerHTML = "";
    addressListMessage.innerHTML = "";
    $('addressListUpdater').style.display = "none";
    if (markers == null)
        return;
        
    // Generate address list
    var j = 0;
    for (i=0; j<10 && i<markers.length && i<maxMarkers; i++) {
        
        // Check, if marker is within the current viewport
        var mapBounds = map.getBounds();
        if (!mapBounds.contains(new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"))))
            continue;
        
        //alert('Marker ' + i + ' ist sichtbar');
        
        // OnClick on address pan to geo location on map
        var clickAction = "map.closeInfoWindow(); map.panTo(new GLatLng(" + markers[i].getAttribute("lat") + "," + markers[i].getAttribute("lng") + ")); $('applicationView').scrollIntoView(true);"
               
        var newdiv = document.createElement('div');
        var divIdName = 'address' + i + 'Div';
                
        newdiv.setAttribute('id',divIdName);
        newdiv.setAttribute('onClick', clickAction);
        //newdiv.attachEvent('onclick', function(event){clickAction});

        newdiv.innerHTML = "laden...";
        addressList.appendChild(newdiv);
        
        var pars = buildQueryString() + '&markerid=' + markers[i].getAttribute("id");
        
        var request = GXmlHttp.create();
        request.open("GET", addressProvider + pars + '&count=true', false);
        request.send(null);
        var sum = request.responseText;
        
        j = j + parseInt(sum);
        
        setTimeout("setAddress('" + divIdName + "', '" + pars + "')", 10);
    }
    
    
    // Update address list message
    if (j == 0) {
        addressListMessage.innerHTML = "Ihre Auswahl führt zu keinem Treffer in diesem Kartenausschnitt.";
        //$('addressListUpdater').style.display = "block";
    } else
        addressListMessage.innerHTML = "Die Liste enthält die in der Karte angezeigten Standortadressen, max. jedoch 10 Stück <br>(geordnet nach Entfernung)";
}

function setAddress(id, pars)
{
    var request = GXmlHttp.create();
    request.open('GET', addressProvider + pars, true);
    request.onreadystatechange = function() 
    {
        if (request.readyState == 4) {
            var htmlDoc = request.responseText;
            document.getElementById(id).innerHTML = htmlDoc;
        }
    }
    request.send(null);
}

function showXML() {
     var url = geoLocationServiceURL + buildQueryString();
     location.href = url;
}

// Prevents the submission of the form if enter key is being hit.
function preventFormSubmission(e) {
    if (e.keyCode!=13)
        return true;
    
    // Relocate the map
    centerMap($('plz').value);
    return false;
}

