    var map;
    var geocoder;
    var tooltip;
	var bounds;
	var query;
	var gPlace; 
	var layer =[];
	var resList = new Array();
	var mousePos = new Array();

	
    function initialize() {
    	$('#search_results').hide();
    	
      	map = new GMap2(document.getElementById("map"), {backgroundColor: aoe_maps['map']['bgColor']});
	  
	  		// map types
	 	map.removeMapType(G_HYBRID_MAP);
      	map.removeMapType(G_NORMAL_MAP);
      	map.addMapType(G_PHYSICAL_MAP); 	
      	map.addMapType(G_SATELLITE_MAP);
	 
	  	map.addControl(new google.maps.SmallMapControl());
	  	map.addControl( new GMapTypeControl() );
	  	
      	map.setCenter(new GLatLng( aoe_maps['map']['centerPointX'] , aoe_maps['map']['centerPointY'] ), aoe_maps['map']['zoomLevel'], aoe_maps['map']['type']);
      	geocoder = new GClientGeocoder();
	  
	  	appendTooltips();
	  
	  	bounds = new GLatLngBounds();
	  	
	  	
	  	$('#tx_aoemaps a.overview').click(function(){
	  		gotoOverview();
	  		return false;	
	  	});
	  
	  		// generate Menu and set markers
	  	getXML('');
    }
    
    function appendTooltips() {
    	    	
    	if ( aoe_maps['map']['tooltips'] == 1 ) {
      		tooltip = $('<div class="aoemaps_tooltips" />');
      		$('#map').append( tooltip );
      		 tooltip.css('display', 'none');
    	}	
    }
    
    	// Set map to default
    function gotoOverview() {
    		query = '';
    		$('#location_map_search .location_map_search_field').val('')
    		$('#tx_aoemaps #search_results').hide();
    		
    		map.closeExtInfoWindow();
    		clearResMsg();
    		map.clearOverlays();
    		getXML('');
    		map.setCenter(new GLatLng( aoe_maps['map']['centerPointX'] , aoe_maps['map']['centerPointY'] ), aoe_maps['map']['zoomLevel']);
    }	
	

    // addAddressToMap() is called when the geocoder returns an
    // answer.  It adds a marker to the map with an open info window
    // showing the nicely formatted version of the address and the country code.
    function addAddressToMap(response) {
	  
	    
      if (!response || response.Status.code != 200) {
	  	
        document.getElementById('aoemaps_indicator').setAttribute('style', 'display:none;');	
        $('#tx_aoemaps .message .err_geoMsg').show();
      } else {
	  	
        gPlace = response.Placemark[0];
		
      }
	  
	  getXML( response.name );
	  
    }
	
	function clearResMsg() {
	
		$('#listBox').html('');
		$('#tx_aoemaps .message > span').hide();	
	}

    // showLocation() is called when you click on the Search button
    // in the form.  It geocodes the address entered into the form
    // and adds a marker to the map at that location.
	function showLocation() {
	
		map.closeExtInfoWindow();
		
		clearResMsg();
		$('#tx_aoemaps #search_results').show();
		$('#tx_aoemaps .message .loading').show();
		
		document.getElementById('aoemaps_indicator').setAttribute('style', 'display:block;');
	
		bounds = new GLatLngBounds();	
    	query = document.forms['google_form'].q.value;	  
    	geocoder.getLocations(query, addAddressToMap);	  
    }

    // findLocation() is used to enter the sample addresses into the form.
    function findLocation(address, uid, rank) {
		
      	document.forms['google_form'].q.value = address;
	  	document.forms['google_form'].catid.value = uid;
	  	document.forms['google_form'].rank.value = rank;
	  	  
	  		// save current position
	  	layer[ rank ] = [];
	  	layer[ rank ]['cat'] = uid;
	  	layer[ rank ]['name'] = address;
	    
	  
      	showLocation();
    }
	 
      
	  var side_bar_html = "";
	  
      var gmarkers = [];
      var htmls = [];
      var i = 0;
      
      
      function createMarker( config ) {
	  	
        var marker = new GMarker( config.point, gicons[config.icontype]);
		marker.category = config.icontype;
		
		if ( aoe_maps['map']['tooltips'] == 1 ) {
			marker.tooltip = config.tooltip;
        	}
        
        	// add Events
        
        	// tooltip events
        if ( aoe_maps['map']['tooltips'] == 1 ) {	
        
        	GEvent.addListener(marker, "mouseover", function() {
        		showTooltip(marker);
        	});
        
        	GEvent.addListener(marker, "mouseout", function() {
         		tooltip.toggle(); 
        	});
	}
		
        GEvent.addListener(marker, "click", function() {
          marker.openExtInfoWindow(map, "balloon", config.html, {paddingX:120,paddingY:10});
        });
        
        
        
		gmarkers[config.id] = marker;
		htmls[config.id] = config.html;
		
		i++;
        return marker;
      }

	  function showTooltip(marker) {
      	tooltip.html( marker.tooltip );
      	
		var offsetMap = $('#map').offset();

		tooltip.css({
			position: 'absolute',
			left: mousePos.pageX - offsetMap.left,
			top: mousePos.pageY - offsetMap.top + 20
		});
		tooltip.toggle(); 
	  }

      function showCat(category) {
	  	
        for (var i in gmarkers) {
          if (gmarkers[i].category == category) {
            gmarkers[i].show();
          }
        }
      }


      function hideCat(category) {
	  	
		for (var k in gmarkers) {
          if (gmarkers[k].category == category) {
            gmarkers[k].hide();
          }
        }

        map.closeExtInfoWindow();
      }

      // == a checkbox has been clicked ==
      function boxclick(box, category){
	  	
		if (box) {
			if (box.checked) {
				showCat(category);
			}
			else {
				hideCat(category);
			}
		}	
      }

	function openWindow(id) {

        	gmarkers[id].openExtInfoWindow(map, "balloon", htmls[id], {paddingX:120,paddingY:10});
      }

      
	function getXML ( current_search, noBounds ) {
	 
		var categories = cat.split(",");
	   	resList = new Array();
   		
       	var request = GXmlHttp.create();
       	request.open("GET", url+"?eID=aoemaps_selectorxml&L="+ lang +"&id="+ pageId +"&pid="+pid+"&cat="+cat+"&q="+ current_search +"&route=" + routepage + getCoordinates(), true);
       	request.onreadystatechange = function() {
			
         	if (request.readyState == 4) {
				
           		var xmlDoc = GXml.parse(request.responseText);
	
           			// obtain the array of markers and loop through it
           		var markers = xmlDoc.documentElement.getElementsByTagName("marker");

				          				   
		   			// marker
		   		if ( markers.length > 0 ) {
		   			map.clearOverlays();
		   
           			for (var i = 0; i < markers.length; i++) {
				
             				// obtain the attribues of each marker
             			var lat = parseFloat(markers[i].getAttribute("lat"));
             			var lng = parseFloat(markers[i].getAttribute("lng"));
             			var point = new GLatLng(lat,lng);
             			var html = markers[i].getAttribute("html");
             			var row = markers[i].getAttribute("row");
			 			var last = markers[i].getAttribute("last");
						var id = markers[i].getAttribute("uid");
						var tooltip = markers[i].getAttribute("tooltip");
			 
             				// === read the icontype attribute ===
             			var icontype = markers[i].getAttribute("icontype");
             			if ( icontype == "" ) {
             				icontype = "baseIcon";
             			}
			 
			 			bounds.extend(point); 
			 
             				// === create the marker, passing the icontype string ===
			 			
			 			
						var configMarker = { id:id, point:point, html:html, icontype:icontype, is_menu:0, last:last, tooltip:tooltip}
			 			var marker = createMarker(configMarker);
						map.addOverlay(marker);
						
						var hasHighlightedRecord = aoe_maps['map']['highlightRecordUid'] > 0;
						var highlightFirstResult = (current_search != '' || aoe_maps['map']['resultList']);
						if (  highlightFirstResult ||  hasHighlightedRecord) {

							resList[i] = row;
							
							if( markers.length == 1 || id == aoe_maps['map']['highlightRecordUid'] ) {
								gmarkers[id].openExtInfoWindow(map, "balloon", html, {paddingX:120,paddingY:10});	
							}
						}						
										 
					}
			
						// hide if category box is not set
					for ( var i = 0; i < categories.length ; i++ ) {
				
						boxclick(document.getElementById(categories[i] + "box"),categories[i]);
					}
			
			
					if (query) {
						if( noBounds != 1 ) {
							
							posByBounds( bounds );
						}
					
												
						if (resList.length) {
							setResults( resList );
						}
					} else {
						
						if ( aoe_maps['map']['autoZoom'] ){
						
							posByBounds( bounds );
						}
						
						if ( aoe_maps['map']['resultList'] && resList.length ) {
							setResults( resList );
							$('#tx_aoemaps #search_results').show();
						}
					} 
					
					
					
				// if markers	
          		} else {
          			
					$('#tx_aoemaps #search_results').hide();
					solveByGoogle();
										
					$('#tx_aoemaps .err_resultMsg').show();
				}
				
				$('#tx_aoemaps .message .loading').hide();
								
         	} 
			 				
			document.getElementById('aoemaps_indicator').setAttribute('style', 'display:none;');

		}	   
	   
		request.send(null);	
		
	}
	
	function setResults( results ) {
	
			$('#tx_aoemaps .message .resultMsg span').html( results.length );
			$('#tx_aoemaps .message .resultMsg').show();
							
			$('#listBox').html( results.join("\n") );
	}
	
	function posByBounds( bounds ) {
	
			map.setZoom(map.getBoundsZoomLevel(bounds));
			map.setCenter(bounds.getCenter());
	}
	
	function solveByGoogle() {
	
		if ( gPlace ) {
			// display all locations
		getXML('', 1 );
	
			// build area and zoom by google response
		bounds = new GLatLngBounds();
		bounds.extend( new GLatLng(gPlace.ExtendedData.LatLonBox.north , gPlace.ExtendedData.LatLonBox.east ) );
		bounds.extend( new GLatLng(gPlace.ExtendedData.LatLonBox.south , gPlace.ExtendedData.LatLonBox.west ) );
					
		map.setZoom(map.getBoundsZoomLevel(bounds));
		map.setCenter( new GLatLng(gPlace.Point.coordinates[1], gPlace.Point.coordinates[0]) );
		
		}
	}
	
	function getCoordinates() {
		
		if( gPlace ) {
			return "&lat=" + gPlace.Point.coordinates[1] + "&long=" + gPlace.Point.coordinates[0];
		}
		
		return '';
	}
	
	$(document).ready(function() {
	
		 initialize();
		 
		 $(document).mousemove(function(e){
      			mousePos = e;
   		}); 

	});


      



