	var emap;
	var edir;
	var unactiveMarkerOptions;
	var activeMarkerOptions;
	var locationMarkerOptions;
	var searchControl;
	var localSearch;
	var lastSearcher;
	var lastMarker = null;
	var locMarker = null;
	var allMarkers = new Array();
	
	function mapInitialize(lat, lang) {
		if (GBrowserIsCompatible()) {
			emap = new GMap2(document.getElementById("google_map"));
			edir = new GDirections();
			emap.addControl(new GSmallZoomControl3D());
 			//var center = new GLatLng(59.4375, 24.7546);
			//emap.setCenter(center, 14);
			emap.disableDoubleClickZoom();
			
			GEvent.addListener(edir, 'error',
				function () {
					//console.log(edir.getStatus().code);
				}
			);
			GEvent.addListener(edir, "load", function() {
				var polyline = edir.getPolyline();
				emap.addOverlay(polyline);
			});

			GEvent.addListener(emap, "click", selectCarPark);

			var customUI = emap.getDefaultUI();
			customUI.controls.scalecontrol = false;
			customUI.controls.menumaptypecontrol = false;
			customUI.keyboard = false;
			customUI.doubleclick = false;
			customUI.scrollwheel = false;

			//Create unactive carparc icon
			var cpImage = new GIcon();
			cpImage.image = "europark/img/parking.png";
			cpImage.shadow = "europark/img/parking_shadow.png";
			cpImage.iconSize = new GSize(50, 50);
			cpImage.shadowSize = new GSize(70, 50);
			cpImage.iconAnchor = new GPoint(25, 50);
			cpImage.infoWindowAnchor = new GPoint(10, 10);
			unactiveMarkerOptions = { icon:cpImage };

			//Create activeactive carparc icon
			var cpaImage = new GIcon();
			cpaImage.image = "europark/img/parking_active.png";
			cpaImage.shadow = "europark/img/parking_shadow.png";
			cpaImage.iconSize = new GSize(50, 50);
			cpaImage.shadowSize = new GSize(70, 50);
			cpaImage.iconAnchor = new GPoint(25, 50);
			cpaImage.infoWindowAnchor = new GPoint(10, 10);
			activeMarkerOptions = { icon:cpaImage };
			
			var locImage = new GIcon();
			locImage.image = "europark/img/black_arrow.png";
			locImage.shadow = null;
			locImage.iconSize = new GSize(50, 50);
			locImage.shadowSize = null;
			locImage.iconAnchor = new GPoint(25, 50);
			locImage.infoWindowAnchor = new GPoint(10, 10);
			locationMarkerOptions = { icon:locImage };
				
			getPointsRequest();
			
			//
			// Init search control
			//
			// Create a search control
			searchControl = new google.search.SearchControl();
			
			var options = new google.search.SearcherOptions();
			options.setExpandMode(google.search.SearchControl.EXPAND_MODE_OPEN);

			localSearch = new google.search.LocalSearch();
			searchControl.addSearcher(localSearch,options);
		
			searchControl.setSearchCompleteCallback(this, searchDone);
		
			// Set the Local Search center point
			//localSearch.setCenterPoint("Helsinki");
			
		
			// Tell the searcher to draw itself and tell it where to attach
			searchControl.draw(document.getElementById("map_search_area"));
			
			//Set default
			selectCity($('#city_id').attr('value') || $('#city_id option:eq(0)').attr('value'));

			
		}
	}
	
	function gotoPage(page) {
		$('#g_page').val(page)
		$('.local_results').hide();
		$('li.loc').removeClass('current');
		$('.google_results').show();
		lastSearcher.gotoPage(page);
	}
	
	function showLocal() {
		$('.google_results').hide();
		$('li.gog').removeClass('current');
		$('li.loc').addClass('current');
		$('.local_results').show();
	}
	
	function searchDone(sc, searcher) {
		lastSearcher = searcher;
		var results = searcher.results.length;
		html = '';
		
		var show_local_div = isNaN($('#g_page').val());
		
		//
		// Local search
		//
		$.post(serviceUrl, {action : "searchParkingzones", search_str : $('#map_search').val() }, function(json){
			
			loc_result = [];
			//Guard for errors
			if(!json.error) {
				loc_result = json.result;
			}
			
			if(!loc_result) {
				loc_result = [];
				show_local_div = false;
			}
			//
			// Make local html
			//
			var loc_html = '';
			if(loc_result.length) {
				for(var l=0; l< loc_result.length; l++) {
					loc_html += '<li class="parkingzone"><a href="javascript:" onclick="loadCarParkData(\''+ loc_result[l].parkingzone_id +'\'); $.scrollTo( \'#map\', 800, {offset:-26} ); return false;">'+loc_result[l].name+'</a><br />'+loc_result[l].address+'</li>';
				}
				loc_html = '<ul class="local_results" style="' + (show_local_div ? '' : 'display:none;') + '">' + loc_html + '</ul>'
			}

			//
			// Google search
			//
			if (!results && !loc_result.length){
				$('#search_results').html('<ul class="no_results"><li>' + _("Sorry couldn't find any matches") + '</li></ul>').slideDown();
		
			} else {
		
				//var current_pos = new google.maps.LatLng(city_pos[(current_city-1)][0], city_pos[(current_city-1)][1]);
		
				var found = 0;
				for (i=0; i<results; i++){
					var result = searcher.results[i];
					var result_location = new google.maps.LatLng(result.lat, result.lng);
					/*
					if(distHaversine(current_pos, result_location) < 30){
					*/
						
					
						html += '<li><a href="javascript:" onclick="showLocation('+result.lng+', '+result.lat+', \''+result.titleNoFormatting.replace("'", "\'")+'\'); return false;">'+result.titleNoFormatting+'</a><br />'+result.streetAddress+'</li>';
						found++;
					//}
					
				}
				
				//Calculate pages
				
				
				pages_html = '';
				if(searcher && searcher.cursor) {
					var made_pages = false;
					for (i=0; i<searcher.cursor.pages.length; i++){
						cls = '';
						if(i == searcher.cursor.currentPageIndex && !show_local_div) {
							cls = ' current ';
						}
						pages_html += '<li class="gog '+ cls  +'"><a href="javascript:" onclick="gotoPage('+  i + ')">' + (i + (loc_html != '' ? 2:1)) + '</a></li>';
						made_pages = true;
					}
					
				} 
				
				if(loc_html != '') {
					
					cls = '';
					if(show_local_div) {
						cls = 'current'
					}
					
					pages_html = '<li class="loc '+ cls  +'"><a href="javascript:" onclick="showLocal()" >1</a></li>' + pages_html;
					
					if(!searcher || !searcher.cursor) {
						
						cls = '';
						if(!show_local_div) {
							cls = 'current'
						}
						
						pages_html += '<li class="gog '+ cls  +'"><a href="javascript:" onclick="gotoPage(0);$(this).parent().addClass(\'current\')">2</a></li>';
					}
					
				}
				
				
				pages_html = '<li>' + _('Pages') + ':</li>' + pages_html;
				
				
				if(found || loc_html != ''){
					$('#search_results').html(loc_html + '<ul class="google_results" style="' + (show_local_div ? 'display:none;':'') + '">' + html + '</ul>' + '<ul class="pages">' + pages_html + '<li class="close_me"><a href="javascript:" onclick="$(\'#search_results\').slideUp();$.scrollTo( \'#search_bar\', 800, {offset:-26} );">' + _('close me') + '</a></li></ul>').slideDown();
				} else {
					$('#search_results').html('<ul class="no_results"><li>' + _('Sorry couldn\'t find any matches') + '</li></ul>').slideDown();
				}
			}
			
			
		}, "json");
		
	}

	
	function changeCity(id, longitude, latitude, zoomlevel, name) {
		
		if(!zoomlevel) zoomlevel = 14;
		var center = new GLatLng(Number(longitude), Number(latitude));
		emap.setCenter(center, Number(zoomlevel));
		
		localSearch.setCenterPoint(name);
		
		//change tabs
		//$('#cities li').removeClass('selected');
		$('#href_' + name ).parents('.dropdown').find('a').removeClass('selected');
		$('#href_' + name ).addClass('selected').parents('.dropdown').find('.dd_selected').text($('#href_' + name ).text());
		$('#map_tabs .map').addClass('selected').siblings().removeClass('selected').hide();
		
		locMarker = null;
		
		if(window.showZoneInfo) showZoneInfo(name);

	}
	
	function selectCity(city_id) {
		var city = cities[city_id];
		if(city) {
			zoomlevel = ( city["zoomlevel"] ? city["zoomlevel"] : 14);
			var center = new GLatLng(Number(city["latitude"]), Number(city["longitude"]));
			emap.setCenter(center, Number(zoomlevel));
			
			localSearch.setCenterPoint(city["name"]);
			
			var hash = getHash();
			var parts = hash.split(':');
			if(parts[0] != city["ascii"]) {
				top.location.hash = city["ascii"] + (parts[1] ? ':' +parts[0] :'');
			}
			
			locMarker = null;
			if (lastMarker != null){
				lastMarker.setImage("europark/img/parking.png");
				lastMarker = null;
				$('#parkinfo').hide();
			}
			
			
			
			if(window.showZoneInfo) showZoneInfo(city["ascii"]);
		}
		
	}
	
	function selectCarPark(marker, latLng, overlayLatLng){
		
		if (marker == null)
			return false;
		
		if(marker.is_location) {
			return false;
		}
		
		if (lastMarker != null){
			lastMarker.setImage("europark/img/parking.png");
		}
		var hash = getHash();
		var parts = hash.split(':');
		
		if(parts.length < 2 && !isNaN(parts[0])) {
			top.location.hash = marker.value;
		} else {
			if((parts[0] + ':' + parts[1]) !=  (parts[0] + ':' + marker.value)) {
				global_hash = parts[0] + ':' + marker.value
				top.location.hash = parts[0] + ':' + marker.value;
			}
		}
		
		marker.setImage("europark/img/parking_active.png");
		lastMarker = marker;
		loadCarParkData(marker.value);
		
		if(locMarker != null) {
			
			var from = locMarker.getLatLng();
			var to = lastMarker.getLatLng();
			edir.load('from: Waypoint1@' + from.y + ',' + from.x + ' to: Waypoint2@' + to.y + ',' + to.x, {travelMode: 2, preserveViewport: true, getSteps: false, getPolyline: true });

		}
		
	}

	function showLocation(lat, lang, title) {
		var point = new GLatLng(lang, lat);
		
		if(locMarker != null) {
			locMarker.setLatLng(point);
			locMarker.tooltip.html(title);
			locMarker.tooltip.redraw(true);
			locMarker.tooltip.show();
			emap.setZoom(15);
			emap.panTo(locMarker.getLatLng());
			
		} else {
			locMarker = new GMarker(point, locationMarkerOptions);
			
			var tooltip = new Tooltip(locMarker,title,0, 'location');
			locMarker.tooltip = tooltip;
			locMarker.is_location = true;
			emap.addOverlay(locMarker);
			emap.addOverlay(tooltip);
			tooltip.show();
			emap.setZoom(15);
			emap.panTo(locMarker.getLatLng());
			
			
			/*
			GEvent.addListener(locMarker,'mouseover',function(){
				tooltip.show();
			});
			GEvent.addListener(locMarker,'mouseout',function(){
				tooltip.hide();
			});
			*/
		
		}
		
		//Give directions
		if(lastMarker != null) {
			
			var from = locMarker.getLatLng();
			var to = lastMarker.getLatLng();
			edir.load('from: Waypoint1@' + from.y + ',' + from.x + ' to: Waypoint2@' + to.y + ',' + to.x, {travelMode: 2, preserveViewport: true, getSteps: false, getPolyline: true });

		}
		
		$.scrollTo( "#map", 800, {offset:-26} );
		//$('#map_tabs .map').toggleClass('selected').siblings().toggleClass('selected');
		//$('#search_results').fadeOut();

	}
	
	function showCarParks(points){
		var point;
		var marker;
		for (var i=0; i<points.length; i++){
			
			if(!points[i].is_active) continue;
			
			point = new GLatLng(points[i].latitude, points[i].longitude);
			marker = new GMarker(point, unactiveMarkerOptions);
			marker.value = points[i].parkingzone_id;
			allMarkers.push(marker);
			
			if(points[i].price_list && points[i].price_list.price && points[i].price_list.price.period != null) {
				points[i].price_list.price = new Array(points[i].price_list.price);
			}
			
			
			if(points[i] && points[i].name) {
				
				var price_html = '';
				if(points[i].price_list && points[i].price_list.price && points[i].price_list.price.length) {
					price_html += '<ul class="price_list">';
					for(var p=0; p < points[i].price_list.price.length; p++) {
						price_html += '<li>' + _(points[i].price_list.price[p].period) + '<span>' + (points[i].price_list.price[p].amount / 100)+ ' ' + points[i].price_list.price[p].currency +  '</span>' + '</li>'
					}
					price_html += '</ul>';
				}
				
				var tooltip = new Tooltip(marker,
					'<h2>' + points[i].name + (points[i].parking_code ? ' (' + points[i].parking_code + ')': '')
					+ '</h2><p>' + points[i].address + '</p>' + price_html
				,0, (price_html != '' ? ' has_prices ':''));
				marker.tooltip = tooltip;
				emap.addOverlay(marker);
				emap.addOverlay(tooltip);

				GEvent.addListener(marker,'mouseover',function(){
					this.tooltip.show();
				});
				
				GEvent.addListener(marker,'mouseout',function(){
					this.tooltip.hide();
				});
				
				
			} else {
				emap.addOverlay(marker);
			}
			
			
			
		}
	}

