;(function(jQuery) {


	var defaults = {
			markerSizeX: 32,
			markerSizeY: 32
	};
	
	//extend the fn for the methods
	jQuery.fn.ifwsgooglemap = function(settings) {
		
		jQuery.extend(this,{

			map: '',
			latlngControl: '',
			mapCenterLongitude: '12.819714546203613',
			mapCenterLatitude: '46.83121999081356',
			mapZoomLevel: 8,
			containerClass: 'ul#list',
			containerChildren: 'li',
			infoClass: 'span.hiddenmapinfo',
			latClass: 'span.latitude',
			lngClass: 'span.longitude',
			hideMap: 1,
			displayShowMapButton: 1,
			buttonShowLabel: 'Show Map',
			buttonHideLabel: 'Hide Map',
			showOnMapIcon: '',
			standardMarkerImg: '',
			maptype: 'ROADMAP',
			
		initialize: function() {
			
			//var mapsize = new GSize(this.mapWidth, this.mapHeight);
			var mapwrapper = this;

			//generate the marker if so
			if (this.standardMarkerImg!='') {
				var stdMarkerImage = new google.maps.MarkerImage(this.standardMarkerImg,
						new google.maps.Size(this.markerSizeX, this.markerSizeY),
						new google.maps.Point(0,0),
						new google.maps.Point(16, 30));
			}
			
			var mapCenter = new google.maps.LatLng(this.mapCenterLatitude, this.mapCenterLongitude);
			
			var mapOptions = {
				zoom: this.mapZoomLevel,
				center: mapCenter}
			if (this.maptype=='HYPRID') {mapOptions['mapTypeId'] = google.maps.MapTypeId.HYBRID;}
			else if (this.maptype=='SATELLITE') {mapOptions['mapTypeId'] = google.maps.MapTypeId.SATELLITE;}
			else if (this.maptype=='TERRAIN') {mapOptions['mapTypeId'] = google.maps.MapTypeId.TERRAIN;}
			else {mapOptions['mapTypeId'] = google.maps.MapTypeId.ROADMAP;}
			
			jQuery(this).css({width: this.mapWidth+'px', height: this.mapHeight+'px'})
			jQuery('#map_canvas').css({width: this.mapWidth+'px', height: this.mapHeight+'px'});
			
			this.map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
			
			if (this.hideMap == 1 ) {
			
				if (this.displayShowMapButton==1) {
					jQuery(this).parent().prepend('<a href="#" class="ifws-google-map-toggle showmap">'+this.buttonShowLabel+'</a>');
					var togglelink=jQuery(this).parent().children('a.ifws-google-map-toggle');
				} else {
					var togglelink=jQuery('.ifws-google-map-control-frame').find('a');
				}
				
				jQuery(togglelink).each(function(){
					jQuery(this).addClass('showmap');
					jQuery(this).click(function(e){
						e.preventDefault();
						if (jQuery(this).hasClass('showmap')) {
							jQuery(mapwrapper).slideDown('slow').show();
							google.maps.event.trigger(mapwrapper.map, 'resize');
							mapwrapper.map.setCenter(mapCenter);						
							jQuery(this).removeClass('showmap').addClass('hidemap').html(mapwrapper.buttonHideLabel);
						} else {
							mapCenter = mapwrapper.map.getCenter();
							jQuery(mapwrapper).slideUp('slow');
							jQuery(this).removeClass('hidemap').addClass('showmap').html(mapwrapper.buttonShowLabel);
						}
					});
				});
					
			}
			
		    this.latlngControl = new google.maps.OverlayView();
		    this.latlngControl.draw = function() {};
		    this.latlngControl.setMap(this.map);
		    
		
			var gmap = this.map;
			
			jQuery(this.containerClass).children(this.containerChildren).each(function(i, el) {
				var mlat = jQuery(el).find(mapwrapper.infoClass).children(mapwrapper.latClass).html();
				var mlng = jQuery(el).find(mapwrapper.infoClass).children(mapwrapper.lngClass).html();
							
				if (mlat != '' && mlng != '') {
					var mpoint = new google.maps.LatLng(mlat,mlng);

					if (mapwrapper.standardMarkerImg!='') {
						var marker = new google.maps.Marker({
							position: mpoint,
							icon: stdMarkerImage,
							map: gmap
						});
					} else {
						var marker = new google.maps.Marker({
							position: mpoint,
							map: gmap
						});
					}
				
			
				google.maps.event.addListener(marker, 'mouseover', function(e) {
			        var projection = mapwrapper.latlngControl.getProjection();
			        var point = projection.fromLatLngToContainerPixel(marker.getPosition());
			        var $mapmessage = jQuery("#mapmessage");
			        
			        $mapmessage.html(jQuery(el).find(mapwrapper.infoClass).children('.markerinfo').html());
			        var mtop = point.y;
			        var mleft = point.x;

			        if ($mapmessage.width()+point.x > jQuery(mapwrapper).width()) {
			        	mleft = point.x-$mapmessage.width();
			        }
			        if ($mapmessage.height()+point.y > jQuery(mapwrapper).width()) {
			        	mtop = point.y-$mapmessage.height()-mapwrapper.markerSizeY;
			        }
			        $mapmessage.fadeIn().css({ top:mtop, left:mleft });
				});
				
				google.maps.event.addListener(marker, 'mouseout', function(e) {
					jQuery('#mapmessage').hide();
				});
				
				};
			});
						
			jQuery("#mapmessage").appendTo(jQuery(this)).mouseout(function(){
				jQuery(this).hide();
			});
			if (this.hideMap == 1) jQuery(this).hide();
			
		}
		
		});

		jQuery.extend(this, defaults, settings);
			
		
		return this;
	};
})(jQuery);
