var localVar = {
			locations : new Array(),
			showAdminIF : false,
			showFlyout : true, 
			showPoiid: "", 
			zoomMarker: 13,
			showMarker: null,
			mapType : "",
			hostUrl : "",
			iconImage : "",
			iconSize : [20, 34],
			showIconShadow : true,
			iconShadowSize : [37, 32],
			flyoutAnchor: [20, 34],
			//ATTION! Use "." and no "," for float numbers.
			centerCoords: [50.0 ,8.2 ,5],
			stemSize: [100, 63],
			smallControls: false,
			showPanControl: true, 
			fade: true,
		
			//boolean to change style on maplayout change (ATTENTION: _dark and _light CSS musst exist!!!)
			handleStyleChange: false,
			
			//Style used to display InfoWindow
			flyoutStyle: "dataInfoWindow",
	
			//for further use (grouping pois)
			markerManager: null,
	
			//@variable	: <object> container for the map
			mapGlobal : null,
			// Contains the marker, spefified by their categories 
			// a[id][x] = marker of category with the number "id"
			arrMarker : {}, 
			// Contains the marker, spefified by their categories 
			// a[id] = marker of category with the number "id"
			arrPointIds : {}, 
			
			//Listener handler
			handle : null,
			
			// timeout saver
			markerTimeout : null,
			
			// container for the markers, whick are created during
			// the adding prozess
			markers : {},
			
			// container for markers which are created from the search
			searchMarkers : {},
			
			// this saves the status of the categories (checked or not checked), because, otherwise
			// there can be problems with the checkboxes
			categoryChecked : {},
			
			//
			closedCats : 'none',
			openCat : '',
			
			// our icons for the marker
			icon : {},
			
			ieBelow7 : false,
			showGS : true
			
}// end localVar
function load() {
	if (GBrowserIsCompatible()){
	loadVariables();
	drawMap();
	cb_getPoints(localVar.locations,false);
	zoomMarker(localVar.showMarker);
	if (localVar.mapType=="G_HYBRID_MAP"){
	  localVar.mapGlobal.setMapType(G_HYBRID_MAP);
	} else if(localVar.mapType=="G_SATELLITE_MAP"){
	  localVar.mapGlobal.setMapType(G_SATELLITE_MAP);
	} else {
	  localVar.mapGlobal.setMapType(G_NORMAL_MAP);
	}
	}
	else {
      alert("Sorry, the Google Maps API is not compatible with this browser");
    }
}
function zoomMarker(marker){
	if (marker!=null){
	  localVar.mapGlobal.setCenter(marker.getPoint(), localVar.zoomMarker);
	  GEvent.trigger(marker,"mouseover");
	}
}
function getMarkerIcon(sType){
 if (sType!=null && sType!=""){
  return localVar.icon[sType];
 } else {
  return localVar.icon['Default'];
 }
}
/** 
 * ========================================================================
 * This functions initialize the global variables, which are needed 
 * for this programm. Also the Icons are set.
 * 
 * ========================================================================
 */
function loadVariables() {
	localVar.markers = new Array();
	localVar.searchMarkers = new Array();
	localVar.categoryChecked = new Array();
	localVar.arrPointIds = new Array();
	addMarkerIcon("BM","poi_bancomat.png",24,27);
	addMarkerIcon("GS","poi_bank3.png",54,54);
	addMarkerIcon("POI","POIicon.png",20,34);
	addMarkerIcon("Default","GSicon.png",20,34);
}
function addMarkerIcon(sName, sFile, nWidth, nHeight){
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image =localVar.hostUrl+'mapResources/$File/' + sFile;
	icon.imageMap = [0,0,nWidth,0,nWidth,nHeight,0,nHeight];
	icon.iconSize = new GSize(nWidth,nHeight);
	icon.iconAnchor = new GPoint(nWidth / 2, nHeight / 2);
	icon.infoWindowAnchor = new GPoint(nWidth / 2, nHeight/2)
	localVar.icon[sName] = icon;
}
function unload() {
		GUnload();
}
function drawMap(){
	
	G_NORMAL_MAP.getTileLayers()[0].getOpacity = function () {return 1;};
	G_SATELLITE_MAP.getTileLayers()[0].getOpacity = function () {return 1;};
	G_HYBRID_MAP.getTileLayers()[0].getOpacity = function () {return 1;};
	G_HYBRID_MAP.getTileLayers()[1].getOpacity = function () {return 0.6;};
	// Controls setzen
	localVar.mapGlobal = new GMap2(document.getElementById("divmap"));
	var map = localVar.mapGlobal;
	
	// Add Controls
		if(localVar.smallControls){
      	  if(localVar.showPanControl){
	        map.addControl(new GSmallMapControl());
              } else {
                map.addControl(new GSmallZoomControl());	
	        }
      	}else{
        map.addControl(new GLargeMapControl());
	}
	if (localVar.mapTypeControl==null&&!localVar.mapTypeControl)
	{
		map.addControl(new GMapTypeControl());
	}
	
	//Center and Activate Mousebehaves
	map.setCenter(new GLatLng(localVar.centerCoords[0],localVar.centerCoords[1]),localVar.centerCoords[2]);
	map.enableDoubleClickZoom();
	//map.addControl(new GOverviewMapControl());
	//Getting Map-Div
	document.getElementById("divmap").style.backgroundColor="#fff";
	
	//MarkerManager init
	localVar.markerManager = new GMarkerManager(map);
	// Create an EWindow -- Anzeigefenster
	ew = new EWindow(map, E_STYLE_1);      
	map.addOverlay(ew);
	
	// Create an EWindow -- Anzeigefenster für Eingaben
	//ew_add = new EWindow(map, E_STYLE_2);
	//map.addOverlay(ew_add);
	if (localVar.showAdminIF){
       GEvent.addListener(map, "mousemove", function(latlng) {
	  document.getElementById("LShowMouseMove").innerHTML = latlng.lng();
	  document.getElementById("BShowMouseMove").innerHTML = latlng.lat();
	 });
	};
	// Close the EWindow if theres a map click 
	GEvent.addListener(map, "click", function(marker,point) {
	  var lng = 0;
	  var lat = 0;
         if (marker){
	    //pan to offset for flyout
		if($.browser.safari || $.browser.msie){
			var table_height = $('.addressTable').height();
			table_height = parseInt(table_height, 10);
			$('.elastic_wrapper').css('height', (table_height + 50) + 'px');
		}
	    lat = marker.getPoint().lat();
	    lng = marker.getPoint().lng();
	    var pixel = map.fromLatLngToDivPixel(new GLatLng(lat, lng));
	    var new_point = new GPoint(pixel.x, pixel.y - 50);
	    var new_latlng = map.fromDivPixelToLatLng(new_point);
	    map.panTo(new_latlng);
	   }
	  if (point) {
	  	markerObj = null;
	    ew.hide();
	  }
	  if (localVar.showAdminIF){
	   if (point){
	    lng = point.lng();
	    lat = point.lat();
         }
         if (marker){
	    lng = marker.getPoint().lng();
	    lat = marker.getPoint().lat();
	   }
	   document.getElementById("LMouseMove").value=lng;
	   document.getElementById("BMouseMove").value=lat;
	  }
	});
	
	//Identify Browser
//	if (navigator.appName == 'Microsoft Internet Explorer') {
//  		verNumIE() ;
//	}
	
	//MapTypeSwitch Trigger
	if(localVar.handleStyleChange){
		localVar.flyoutStyle = "dataInfoWindow_dark";
		GEvent.addListener(map, "maptypechanged", function() {
		  //Hide when not IE7 couse display mistakes
		  //if(localVar.ieBelow7) 
		  var wasOpened = false;
		  var markerTemp = null;
		  if(ew.visible){
		  	markerTemp = markerObj;
		  	hideFlyout("EWindowMain","EWindowSub");
		  	wasOpened = true;
		  }
		  if (map.getCurrentMapType() == G_NORMAL_MAP) {
		    if(document.getElementById('dataInfoWindow')){
		    	document.getElementById('dataInfoWindow').className = 'dataInfoWindow_dark';
   				localVar.flyoutStyle = 'dataInfoWindow_dark';
		    }else{
   				localVar.flyoutStyle = 'dataInfoWindow_dark';
		    }
		  }else{
		  	if(document.getElementById('dataInfoWindow')){
		    	document.getElementById('dataInfoWindow').className = 'dataInfoWindow_light';
   				localVar.flyoutStyle = 'dataInfoWindow_light';
		    }else{
   				localVar.flyoutStyle = 'dataInfoWindow_light';
		    }
		  }
		  if(wasOpened){
		  	//markerObj = null;
		  	GEvent.trigger(markerTemp,"mouseover");
		  }		  	
		});	
	}
	
}
var markerObj = null;
function createMarker(point, data) {
	var marker = new GMarker(point,createIcon(getMarkerIcon(data['type'])));
	
	if (localVar.showFlyout==true){
	 // ========== Open the EWindow instead of a Google Info Window ==========
 	 GEvent.addListener(marker, "click", function() {
	  if(!(markerObj === marker)){
	   ew.openOnMarker(marker,flyout(data,localVar.showGS));
	   GEvent.clearListeners(marker, "mouseout");
	   markerObj = marker;
	  }
       });
	
		
	 GEvent.addListener(marker, "mouseout", function() {
	  //ew.hide();
	 }); 
	}
	 GEvent.addListener(marker, "click", function() {
	  localVar.mapGlobal.panTo(marker.getPoint());
	  markerObj = marker;
	 });
	return marker;
}
function createIcon(icon) {
	var newIcon = new GIcon(icon);
	//if(localVar.showIconShadow==true){
	  //newIcon.shadow = localVar.hostUrl+'mapResources/$File/shadow.png';
           //newIcon.shadowSize = 
		//new GSize(localVar.iconShadowSize[0], localVar.iconShadowSize[1]);
	//} else {
	  //newIcon.shadow = "";
      //}
	  newIcon.shadow = "";
	return newIcon;
}
/** 
  * ========================================================================
  * this function adds a point into the map.
  *
  * @param #1	: <hash> 	Returning JSON Values
  * @param #2	: <boolean> 	shows, if the points are added after a search or not
  * ========================================================================
  */
function addPoint(data) {
	// get data from hash
	var iLat = data['latitude'];
	var iLong = data['longitude'];
	var point 	= new GLatLng(iLat,iLong); 
	var marker	= createMarker(point, data);
	if (localVar.showPoiid!="" && data['poiid']!=null && data['poiid']==localVar.showPoiid && marker!=null){
	  localVar.showMarker = marker;
	}
 	
	//localVar.mapGlobal.addOverlay(marker);
	localVar.markers.push(marker);
}
	
/** 
 * ========================================================================
 * This callback function gets the Points from the called Java function
 * and adds them to the map.
 * 
 * @param	: <array> Containing the position information for google maps
 * ========================================================================
 */
function cb_getPoints(data) {
	if (data != null && typeof data == 'object') {	
		localVar.markerManager = new GMarkerManager(localVar.mapGlobal);
		//document.getElementById('test').innerHTML = print_r(data);
		for (i=0; i<data.length; i++) {
			addPoint(data[i]);
			
		}
		localVar.markerManager.addMarkers(localVar.markers,0,17);
			
		localVar.markerManager.refresh();
		//alert("teste");
	} 
}
// ======================================================================== EVENT HANDLER FUNCTIONS  ========================================================================
/**  
 * ========================================================================
 * Because of attaching events to object are different de different browsers, 
 * the addEventhandler function can be used to attach an event to an object. 
 * This function can be used by all Browser types.
 *
 * @param #1		: <object>		Object, which will be connected to  the event
 * @param #2		: <event>			without on "click"
 * @param #3		: <function>	The function that handles the event
 *
 *=======================================================================
 */	 
function addEventHandler (element, event, handler)
{
	var tmp, event;
	
	if (!element || !event) return false;
	
	if (element.addEventListener)
		element.addEventListener(event, handler, false);
	else {
		sOnEvent = "on"+event;
		if (element.attachEvent) // IE
			element.attachEvent(sOnEvent, handler);
		else {					// older Browser
			tmp = element[sOnEvent];
			element[sOnEvent] = typeof tmp == 'function' ? (function() { tmp(); handler();}) : handler;
		}
	}
}
/** 
 * ========================================================================
 * halts the propagation of events in the DOM Hierarachy
 * @param #1		: <event>
 * ========================================================================
 */
function stopPropagation(event) {
	if (typeof event.target == "undefined") window.event.cancelBubble = true;
	else if (event.stopPropagation) event.stopPropagation();
}
// ======================================================================== END EVENT HANDLER FUNCTIONS  ========================================================================
/** 
 * ========================================================================
 * Removes Left & Right White Spaces
 * 
 * ========================================================================
 */
  String.prototype.trim = function () {
    return (this.replace(/\s+$/,"").replace(/^\s+/,""));
  };
  
  /** 
 * ========================================================================
 * This function is an helper, which prints an hash 
 * 
 * @param	: <hash> 
 * @returns	: <string> key and Values of the hash
 * ========================================================================
 */
function print_r(arr) {
		if (typeof arr == "undefined") return "";
		var s = "";
		if (typeof arr == "object") {
				for (var x in arr) {
						if (typeof arr[x] == "object") s += x + " ==> ("+ print_r(arr[x]) + ")<br />";
						else
								s += x + " ==> "+ arr[x] + "<br />";
				}
		}else
			s += "text ==> " + arr + "<br />";
			
		return s;
}
//======================================================================= Browser Version Test =============
function verNumIE() {
    var brVer = navigator.userAgent;
    var brVerId = brVer.indexOf('MSIE');
    var brNum = brVer.substr(brVerId+5,1);
    if(brNum < "7"){
    	localVar.ieBelow7 = true;
    }
}
function verNumOt() {
	var reg = new RegExp('/');
	var brVer = navigator.userAgent;
    var brVerId = brVer.search(reg);
    var brNum = brVer.substring(brVerId+1);
}

