Drupal.behaviors.neova_gmap = function(context) {
	
	var $map_wrap = $('#neova-gmap', context);
	//init
	if($map_wrap.length) {
		//init
		if(GBrowserIsCompatible()) {
			
			var $map_tag = $('#neova-gmap-view', context);
			var map_wrap = $map_wrap[0];
			$('#sidebar-left').append('<div id="neova-gmap-nav-wrap" class="empty"><div id="neova-gmap-nav"></div></div>');

			//TODO: usla funktionsnamn mm

			// Update current position info.
			this.neova_gmap = new GMap2(map_wrap);
			// Update current position info.

			var default_latlng = new google.maps.LatLng(60.0, 14.86);
			var default_zoom = 6;
			if($map_tag.hasClass('retailers-gmap-sv')) {
				default_latlng = new google.maps.LatLng(60.0, 14.86);
				default_zoom = 6;
			}
			else if($map_tag.hasClass('retailers-gmap-da')) {	
				default_latlng = new google.maps.LatLng(56.12, 10.45);
				default_zoom = 7;
			}
			else if($map_tag.hasClass('facilities-gmap-sv')) {	
				default_latlng = new google.maps.LatLng(62.0, 15.86);
				default_zoom = 7;
			}

			this.neova_gmap.setCenter(default_latlng, default_zoom);
			this.neova_gmap.setUIToDefault();
			this.neova_gmap.setMapType(G_NORMAL_MAP);


			/*
			 GEvent.addListener(neova_gmap, 'moveend', function() {
			 console.log('move');
			 refresh_nav_items(neova_gmap, map_markers);
		 });
		 */

			var styles = [
			{
				height : 53,
				width : 52,
				url : 'http://neova.se/sites/neova.se/themes/neova/images/icons/gmaps/neova_retailer_cluster.png',
				opt_anchor : [18,24],
				opt_textColor : 'white'
			},
			{
				height : 53,
				width : 52,
				url : 'http://neova.se/sites/neova.se/themes/neova/images/icons/gmaps/neova_retailer_cluster.png',
				opt_anchor : [18,21],
				opt_textColor : 'white'
			},
			{
				height : 53,
				width : 52,
				url : 'http://neova.se/sites/neova.se/themes/neova/images/icons/gmaps/neova_retailer_cluster.png',
				opt_anchor : [18,18],
				opt_textColor : 'white'
			}
			];

			this.marker_clusterer = new MarkerClusterer(this.neova_gmap, [], {maxZoom: 8, styles: styles});

		}
	}

	if(typeof(this.neova_gmap) !== 'undefined') {
		if(this.marker_clusterer.getTotalMarkers()) {
			this.marker_clusterer.clearMarkers();
		}

		function openNeovaExtInfoWindow(marker, content) {
			marker.openExtInfoWindow(neova_gmap, 'neova_gmap_infowindow', content, {beakOffset: 0, paddingX: 60, paddingY: 30});
		}
		function closeNeovaExtInfoWindow(marker){
			marker.closeExtInfoWindow(neova_gmap);
		}

		var settings = {};
		this.map_markers = [];

		//TODO: this is a mess, better way of creating references?
		this.map_markers_settings = [];

		$map_data = $('#neova-gmap-data', context);
		if($map_data.length){

			function attach_bubble(latlng, title, content, icon) {
				var marker = new GMarker(latlng, {title: title, icon: icon});
				GEvent.addListener(marker, 'click', function() {
						openNeovaExtInfoWindow(marker, content);
					}
				);
				return marker;
			}

			var not_mappable = [];

			//create markers
			for(i in Drupal.settings.neova_gmap) {
				settings = Drupal.settings.neova_gmap[i];
				if(parseInt(settings.lat) == 0 || settings.lng == 0) {
					not_mappable.push(settings);
				}
				else {
					var marker_icon = new GIcon(G_DEFAULT_ICON);
					marker_icon.iconSize = new GSize(20, 35);
					marker_icon.image = 'http://neova.se/sites/neova.se/themes/neova/images/icons/gmaps/' + settings.icon;
					var marker_latlng = new GLatLng(settings.lat, settings.lng);
					this.map_markers.push(attach_bubble(marker_latlng, settings.title + ', ' + settings.city, settings.content, marker_icon));
					this.map_markers_settings.push(i);
				}
			}

			function append_nav_item(marker, settings, $nav) {
				var setting = Drupal.settings.neova_gmap[i];
				$('<div><a href="#">' + marker.getTitle() + '</a></div>').appendTo($nav).click(function(){
						GEvent.trigger(marker, 'click');
						return false;
					}
				).hoverIntent({
						sensitivity : 3,
						interval : 500,
						timeout : 400,
						over: function() {
							openNeovaExtInfoWindow(marker, settings.content);
						},
						out: function() {
							//closeNeovaExtInfoWindow(marker);
						}
					});
			}

			function refresh_nav_items () {
				var $nav =  $('#neova-gmap-nav-wrap #neova-gmap-nav').empty();
				var _markers = [];
				var _markers_settings = [];
				for(i in map_markers) {
					if(neova_gmap.getBounds().containsLatLng(map_markers[i].getLatLng())) {
						_markers.push(map_markers[i]);
						_markers_settings.push(map_markers_settings[i]);
					}
				}
				if(_markers.length <= 60) {
					for(i in _markers){
						append_nav_item(_markers[i], Drupal.settings.neova_gmap[_markers_settings[i]], $nav);
					}
				}
				if($nav.children().length) {
					$nav.parent().removeClass('empty');
					$(':first-child', $nav).addClass('first');
					$(':last-child', $nav).addClass('last');
				}
				else {
					$nav.parent().addClass('empty');
				}
				marker_clusterer.resetViewport();
			}
			this.marker_clusterer.addMarkers(this.map_markers);
			refresh_nav_items();
		}
		else {
			var $nav = $('#neova-gmap-nav-wrap #neova-gmap-nav').empty();
			$nav.html('<i>' + Drupal.t('No matching results found.') + '</i>').parent().removeClass('empty');
		}
		//Sökningen gav tyvärr inga träffar.
		if($map_wrap.length){
			GEvent.addListener(this.neova_gmap, 'tilesloaded', function() {
					refresh_nav_items();
				});
		}
	}
}
