function GMaps() {
	this.key = 'AIzaSyDkuaEMkLhTiAGaVto2Sw2ig-Reyb8FMsI';
	this.map;
	this.markerClusterer = null;
	this.infowindow = null;
	this.markers = null;
	this.mapname = "map_canvas";
	this.adminmap = false;
	this.scrollwheel = false;
	this.latfield = "latfield";
	this.lngfield = "lngfield";
	this.zoomfield = "zoomlevel";
	this.maplatfield = "maplatfield";
	this.maplngfield = "laplngfield";
	this.ib = null;
	this.viewType = google.maps.MapTypeId.ROADMAP;

	this.GMaps = function() {
		
	};
	
	this.loadMap = function(lat, lon, zoom) {
		
		var myLatlng = new google.maps.LatLng(lat, lon, zoom);
		scrollwheel = this.scrollwheel;
		var myOptions = {
			zoom: zoom,
			center: myLatlng,
			mapTypeId: this.viewType,
			scrollwheel: scrollwheel,
			scaleControl: false,
			draggable: true,
			zoomControl: true,
			streetViewControl: false,
			mapTypeControl: true,
	    }
		map = new google.maps.Map(document.getElementById(this.mapname), myOptions);
		this.map = map;
		if ($("#"+this.maplatfield).val() != 'undefined' && $("#"+this.maplngfield).val() != 'undefined') {
			$("#"+this.maplatfield).val(lat);
			$("#"+this.maplngfield).val(lon);
		}
		zoomlevel = this.zoomfield;
		google.maps.event.addListener(map, 'zoom_changed', function() {
			//alert(map.zoom);
			$("#"+zoomlevel).val(map.zoom);
		});
		latfield = this.maplatfield;
		lngfield = this.maplngfield;
		google.maps.event.addListener(map, 'dragend', function() {
			var coords = map.getCenter();
			$("#"+latfield).val(coords.lat());
			$("#"+lngfield).val(coords.lng());
		});
		google.maps.event.addListener(map, 'click', function(event) {
			hideBlock();
        });
		if (this.adminmap) {
			google.maps.event.addListener(map, 'click', function(event) {
				gmaps.clearClusters();
				gmaps.editMarker(event.latLng.lat(), event.latLng.lng());
			});
		}
	};
	
	this.setCountryMarkers = function(country_id, travel_type) {
		this.clearClusters();
		var markers = [];
		var markerImage = new google.maps.MarkerImage();
		var map = this.map;
		var traveltypetoslug = '';
		if (travel_type != 'undefined' && travel_type != '') {
			traveltypetoslug = "/reisvorm:"+travel_type;
		}
		$.getJSON('/items/getCitiesByCountryId/'+country_id+traveltypetoslug, function(data) {
			if (!data) return false;
			setZoom(data[0]['coordinates'].zoomlevel);
			for (var i = 0; i < data.length; i++) {
	        	
				var latLng = new google.maps.LatLng(data[i]['coordinates'].lat, data[i]['coordinates'].lng);
				
	        	var marker = newMarker(data[i].name, latLng, data[i].name, data[i].id, data[i].slug+traveltypetoslug);
	        	markers.push(marker);
//	        	
	        }
		});
        this.markers = markers;
	}
	
	this.setCityMarkers = function(city_id, travel_type) {
		this.clearClusters();
		var map = this.map;
		var traveltypetoslug = '';
		if (travel_type != 'undefined') {
			traveltypetoslug = "/reisvorm:"+travel_type;
		}
		$.getJSON('/items/getTravelsByCityId/'+city_id+"/reisvorm:"+travel_type, function(data) {
			var latLng = new google.maps.LatLng(data[0]['Coordinate'].lat, data[0]['Coordinate'].lng);
			
        	var marker = newMarker(data[0].name, latLng, data[0].name, data[0].id, data[0]['Node'].slug+traveltypetoslug);
        	var content = "";
        	$.ajax({
        		url: '/items/showTravelsByCityId/'+city_id+traveltypetoslug, 
        		success: function(data) {
        			var infowindow = new google.maps.InfoWindow({
            			content: data
        				});			
            		infowindow.open(map, marker);
        		}
        	});
        	
        	
		});
     
	}
	
	this.showTour = function(tour_id) {
		this.clearClusters();
		var map = this.map;
		var markers = [];
		$.getJSON('/travels/getTour/'+tour_id, function(data) {
//			var latLng = new google.maps.LatLng(data[0]['Googlemap'].lat, data[0]['Googlemap'].lng);
//			alert(data);
			for (var i = 0; i < data.length; i++) {
				var latLng = new google.maps.LatLng(data[i]['Coordinate'].lat, data[i]['Coordinate'].lng);
				
	        	var marker = newMarker(data[i]['Item'].name, latLng, data[i]['Item'].name, data[i]['Item'].id, data[i]['Node'].slug);
	        	markers.push(marker);
	        }
        	
		});
		this.markers = markers;
	};
	
	
	function setZoom(zoomlevel) {
		
		this.map.setZoom(parseInt(zoomlevel));
		
	}
	
	this.setZoom = function(zoomlevel) {
		setZoom(zoomlevel);
	}
	
	this.clearClusters = function() {
		if (this.markers) {
			for (var marker in this.markers) {
				this.markers[marker].setMap(null);
			}
		} if (this.markerClusterer) {
			this.markerClusterer.clearMarkers();
		}
		this.markers = null;
	}
	
	this.loadCountry = function(name) {
		this.findByName(name);
	};
	
	
	this.centerMap = function(lat, lnG, zoomlevel) {
		var latLng = new google.maps.LatLng(lat, lnG);
		this.map.setCenter(latLng);
		this.map.setZoom(parseInt(zoomlevel));
	};
	
	function newMarker(info, latLng, name, id, slug) {
		//alert(slug);
		var marker = new google.maps.Marker({
    		position: latLng,
    		draggable: false,
    		animation: google.maps.Animation.DROP,
    		map: this.map
    	});
		
		if (name != undefined) {
			google.maps.event.addListener(marker, 'mouseover', function() {
				var boxText = document.createElement("div");
				boxText.id = 'loadBoxBlock';
				boxText.innerHTML = name;
				var myOptions = {
						 content: ''
						,disableAutoPan: false
						,maxWidth: 0
						,pixelOffset: new google.maps.Size(0, 0)
						,zIndex: null
						,boxStyle: { 
						  width: "100px",
						  background: "white"
						 }
						,closeBoxURL: ""
						,infoBoxClearance: new google.maps.Size(1, 1)
						,isHidden: false
						,pane: "floatPane"
						,enableEventPropagation: false
					};
					
					var ib = new InfoBox(myOptions);
					ib.setContent(boxText);
					
					ib.open(this.map, marker);
					this.ib = ib;
	    	});
			google.maps.event.addListener(marker, 'mouseout', function() {
				this.ib.close();
			});
		}
		google.maps.event.addListener(marker, 'click', function() {
			
			loadAjaxInfo(slug);
    	});
    	return marker;
	};
	
	this.showMarker = function(lat, lng) {
		var latLng = new google.maps.LatLng(lat, lng);
		var marker = new google.maps.Marker({
    		position: latLng,
    		draggable: false,
    		animation: google.maps.Animation.DROP,
    		map: this.map
    	});
    	return marker;
	}
	
	this.editMarker = function(lat, lon) {
		
		var latLng = new google.maps.LatLng(lat, lon);
		var marker = new google.maps.Marker({
    		position: latLng,
    		draggable: true,
    		animation: google.maps.Animation.DROP,
    		map: this.map
    	});
		var markers = [marker];
		this.markers = markers;
		
		markerlat = this.latfield;
		markerlng = this.lngfield;
		if ($("#"+markerlat).val() != marker.position.lat())
				
			$("#"+markerlat).val(marker.position.lat());
		
		if ($("#"+markerlng).val() !=  marker.position.lng())
			$("#"+markerlng).val(marker.position.lng());
		
		google.maps.event.addListener(marker, 'mouseup', function() {
			$("#"+markerlat).val(marker.position.lat());
			$("#"+markerlng).val(marker.position.lng());
    	});
	}
	
	// temp!
	this.countryLabel = function(lat, lng, name, count, slug) {
		
		var shape = {
		      coord: [1, 1, 1, 40, 50, 40, 50 , 1],
		      type: 'poly'
		  };
		var markers = Array();
			var myLatLng = new google.maps.LatLng(lat, lng);
			
			var marker = new google.maps.Marker({
				position: myLatLng,
				map: this.map,
				icon: "/toimg.php?number="+escape(name)+": "+count,
				shaddow: "/toimg.php?number="+escape(name)+": "+count,
				shape: shape,
				title: "",
				zIndex: 1
			});
//			google.maps.event.addListener(marker, 'click', function() {
//				$("#countryselect").val($(this).attr('title'));
//				$("#countryselect").trigger('change');
//	    	});
			google.maps.event.addListener(marker, 'click', function() {
				loadAjaxInfo(slug);
	    	});
			markers.push(marker);
		this.markers = markers;
	}
	
	function showBlock(data, map, marker) {
//		map.panTo(marker.getPosition()); 
//		loadBlockView(data['BuildingBlock'].id);
		var boxText = document.createElement("div");
		boxText.id = 'loadBoxBlock';
//		boxText.style.cssText = "border: 1px solid black; margin-top: 8px; background: yellow; padding: 5px;";
		$.ajax({
			url: "/building_blocks/loadBox/"+data['BuildingBlock'].id,
			success: function(data){
//				$("#infoPanel").html(data);
				boxText.innerHTML = data;
//				$("#infoPanel").fadeIn();
			}
		});

		var myOptions = {
			 content: ''
			,disableAutoPan: false
			,maxWidth: 0
			,pixelOffset: new google.maps.Size(0, 0)
			,zIndex: null
			,boxStyle: { 
			  width: "420px"
			 }
//			,closeBoxMargin: "10px 2px 2px 2px"
//			,closeBoxURL: "http://www.google.com/intl/en_us/mapfiles/close.gif"
			,infoBoxClearance: new google.maps.Size(1, 1)
			,isHidden: false
			,pane: "floatPane"
			,enableEventPropagation: false
		};
		
		var ib = new InfoBox(myOptions);
		google.maps.event.addListener(ib, 'content_changed', function(event) {
			var th = this;
			var interval = setInterval(function() {
				if ($(th.content_).find(".tabsInBox").length != 0) {
					$(th.content_).find('.tabsInBox').tabs('.panes > div', {
						effect: 'fade'
					});
					clearInterval(interval);
				}
			}, 500);
	    });
		ib.setContent(boxText);
		
		ib.open(this.map, marker);

		
//		ib.open(this.map, marker);
		
		
	}
	
	function hideBlock() {
		$("#infoPanel").fadeOut();
	}
	
	function bbMarker(latLng, map, data) {
			var marker = new google.maps.Marker({
	    		position: latLng,
//	    		draggable: false,
//	    		animation: google.maps.Animation.DROP,
	    	//	map: map
	    	});
			
//			google.maps.event.addListener(marker, 'click', function() {
//				  showBlock(marker,data['BuildingBlock'].id);
//			});
			google.maps.event.addListener(marker, 'click', function() {
				showBlock(data, map, marker);
	    	});
			
	    	return marker;
	}
	
	
	this.loadBuildingBlocks = function(slug) {
		var localMap = this.map;
		var url = '/building_blocks/getAllBuildingBlocks';
		if (slug != '') url += '/'+slug;
		$.getJSON(url, function(data) {
			var markers = [];
			for (var i = 0; i < data.length; i++) {
				var latLng = new google.maps.LatLng(data[i]['Coordinate'].lat, data[i]['Coordinate'].lng);
				var marker = bbMarker(latLng, localMap, data[i]);
				
	        	markers.push(marker);
			}
			var options = { maxZoom:4}
			var markerClusterer = new MarkerClusterer(localMap, markers, options);
			markerClusterer.resetViewport();
		});
	}
	
}

