(function($)
{
	// Main plugin function
	$.fn.gMap = function(options)
	{
		// Check if the browser is compatible
		if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;

		// Build main options before element iteration
		var opts = $.extend({}, $.fn.gMap.defaults, options);
    	
		// Iterate through each element
		return this.each(function()
		{
			// Create map and set initial options
			$gmap = new GMap2(this);
			
			// Create new object to geocode addresses
			$geocoder = new GClientGeocoder();
			
			// Check for address to center on
			if (opts.address)
			{ 
				// Get coordinates for given address and center the map
				$geocoder.getLatLng(opts.address, function(gpoint){ $gmap.setCenter(gpoint, opts.zoom); });
			}
			else
			{
				// Check for coordinates to center on
				if (opts.latitude && opts.longitude)
				{
					// Center map to coordinates given by option
					$gmap.setCenter(new GLatLng(opts.latitude, opts.longitude), opts.zoom);
/* 					bounds.extend(new GLatLng(opts.latitude, opts.longitude)); */
				}
			}
						
			// Set the preferred map type
			$gmap.setMapType(opts.maptype);

			// Check for map controls
			if (opts.controls.length == 0)
			{
				// Default map controls
				$gmap.setUIToDefault();
			}
			else
			{
				// Add custom map controls
				for (var i = 0; i < opts.controls.length; i++)
				{
					// Eval is evil
					eval('$gmap.addControl(new ' + opts.controls[i] + '());');
				}
			}

			// Check if scrollwheel should be enabled
			if (opts.scrollwheel == true && opts.controls.length != 0) { $gmap.enableScrollWheelZoom(); }
			
			var geoXml = new GGeoXml("http://gmaps-samples.googlecode.com/svn/trunk/ggeoxml/cta.kml");
			$gmap.addOverlay(geoXml);
			
			var defaultIcon = new GIcon();
			defaultIcon.image = opts.default_icon_path;
			defaultIcon.iconSize = new GSize(20, 24);
			defaultIcon.iconAnchor = new GPoint(10, 12);
			defaultIcon.infoWindowAnchor = new GPoint(13, 12);
			
			var layers = [];      
		    layers['wiki'] = new GLayer("org.wikipedia.de");
		    layers['wiki'].Visible = false;
		    layers['wiki'].Added = false;
		    layers['panoramio'] = new GLayer("com.panoramio.all");
		    layers['panoramio'].Visible = false;
		    layers['panoramio'].Added = false;
		    layers['youtube'] = new GLayer("com.youtube.all");
		    layers['youtube'].Visible = false;
		    layers['youtube'].Added = false;
			
			// Options dem Object zuordnen
			$gmap.opts = opts;
			
			// My Functions
			$gmap.createMarker = function(options) {
				var point = new GLatLng(options.lat, options.lon)
				if (options.icon) {
					var myIcon = new GIcon();
						myIcon.image = options.icon;
						myIcon.iconSize = new GSize(20, 24);
						myIcon.iconAnchor = new GPoint(10, 12);
						myIcon.infoWindowAnchor = new GPoint(13, 12);
					var marker_options = {icon: myIcon};
				} else {
					var marker_options = {icon: defaultIcon};		
				}
				var marker = new GMarker(point, marker_options);
				
				GEvent.addListener(marker, $gmap.opts.window_handler, function() {
					var url_window_content = "/layout/set/ajax/content/view/full/" + $gmap.opts.map_node_id + "/(window)/1/(node)/" + options.window_node_id; 
					marker.openExtInfoWindow(
	      				$gmap,
					   "my_info_window",
					   "Loading...",
			      	   {paddingX: 10, paddingY: 10, beakOffset: 0, ajaxUrl: url_window_content}
	    			); 
    			});				
				
				groupBounds[options.group].extend(marker.getPoint());			
				markerGroups[options.group].push(marker);				
				$gmap.addOverlay(marker);
			}
		
			$gmap.getMarker = function(options) {
				$gmap.toogleLoader(1);
				var url = "/layout/set/ajax/content/view/full/" + $gmap.opts.map_node_id + "/(marker)/1/(node)/" + options.node_id;
				$.getJSON(url, function(data){
					$.each(data, function(i,item){
						$gmap.createMarker({
							lat: item.lat,
							lon: item.lon,
							group: 'group_' + item.node_id,
							icon: item.icon,
							window_node_id: item.window_node_id
						});
		          	});
		          	$gmap.refreshBounds('group_' + options.node_id);
		          	$gmap.toogleLoader(0);
				});
			}
		
			$gmap.toggleGroup = function(options) {
				var group = 'group_' + options.node_id;
				if (markerGroups[group].length > 0) {
					for (var i = 0; i < markerGroups[group].length; i++) {
						var marker = markerGroups[group][i];
						if (marker.isHidden()) {
							marker.show();
							$gmap.refreshBounds(group);
						} else {
							marker.hide();
						}
					}
				} else {
					$gmap.getMarker({node_id: options.node_id});
				}
			}
			
			$gmap.toggleLayer = function(mapplet_type) {

				if (layers[mapplet_type].Visible) {
					layers[mapplet_type].hide();
				} else {
					if (layers[mapplet_type].Added) {
						layers[mapplet_type].show();
					} else {
						$gmap.addOverlay(layers[mapplet_type]);
						layers[mapplet_type].Added = true;
					}
				}
				layers[mapplet_type].Visible = !layers[mapplet_type].Visible;
			}
			
			$gmap.refreshBounds = function(group) {
				$gmap.setZoom($gmap.getBoundsZoomLevel(groupBounds[group])-1);
				$gmap.setCenter(groupBounds[group].getCenter());
			}
			
			// Clickhandler
			$gmap.initHandler = function() {
				$(".map_nav .map_nav_title").click(function(){
					var contentbox = $(this).next(".map_nav_content_holder");
					if (contentbox.is(":hidden")) {
						$(this).addClass("open");
						contentbox.slideDown("fast", function () {
							contentbox.addClass("open");					
						});
					} else {
						$(this).removeClass("open");
						contentbox.slideUp("fast", function () {
							contentbox.removeClass("open");											 
						});		
					}
				});
				
				$('input.map_nav_group:checkbox').click(function() {
					$gmap.toggleGroup({node_id:$(this).attr("id")});
				});
				
				$('input.map_nav_mapplet:checkbox').click(function() {
					var mapplet_type = this.name;
					$gmap.toggleLayer(mapplet_type);
				});

				$('.map_fullscreen_toggler').click( function() {
					$('#map_content').toggleClass('container_fullscreen');
					if ($('#map_content').hasClass('container_fullscreen')) {
						$('#map').css({"height":jQuery(window).height() + 15, "width":jQuery(window).width() + 15});
						$('body').css({"overflow":"hidden", "height":jQuery(window).height() + 15, "width":jQuery(window).width() + 15});
						$gmap.checkResize();
					} else {
						$('#map').css({"height":"500px", "width":"100%"});
						$('body').css({"overflow":"visible", "height":"auto", "width":"auto"});
					}
				});

			}
			
			$gmap.reloadMap = function() {
				$('input.map_nav_group:checkbox').each(function() {
					if (this.checked) {
						var node_id = this.name;
						$gmap.toggleGroup({node_id:$(this).attr("id")});
					}
				});
				$('input.map_nav_mapplet:checkbox').each(function() {
					if (this.checked) {
						var mapplet_type = this.name;
						$gmap.toggleLayer(mapplet_type);
					}
				});
			}
			
			$gmap.toogleLoader = function (status) {
				if (status == "1") {
					$('#map_loader').show();
				} else {
					$('#map_loader').hide();
				}
			}
			
		});		
	}
		
	// Default settings
	$.fn.gMap.defaults =
	{
		latitude:				0,
		longitude:				0,
		zoom:					1,
		controls:				[],
		scrollwheel:			true,
		//maptype:				G_NORMAL_MAP,
		window_handler:			'click'
	}
	
})(jQuery);
