jQuery(document).ready(function ($) {
	var GMapData = {
		availableMaps: [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP],
		geocoder: new GClientGeocoder(),
		
		setupMapFunction: function ( params, point, centerInfo) {
			var innerMap = params["_innermap"];
			
	        var maptypes = GMapData.getMapTypesFromInfo( params["maptype"] );
			var map = new GMap2(innerMap, { mapTypes: maptypes });

			if( point ) {
				map.setCenter(point, parseInt(params["zoom"]));
	            if(params["marker"]) {
	            	GMapData.addMarker( map, point, centerInfo );
	            }
			}
			else {
				// Someplace nice
				map.setCenter( new GLatLng( 37.771376, -122.402107 ), 13 );
			}
	
			if( params["controls"] == "large" )
				map.addControl(new GLargeMapControl());
			if( params["controls"] == "medium" )
				map.addControl(new GSmallMapControl());
			if( params["controls"] == "small" )
				map.addControl(new GSmallZoomControl());
	
			if( params["mapscale"])
				map.addControl(new GScaleControl());
			
	        if( params["maptypecontrol"])
	        	map.addControl(new GMapTypeControl());
	        
	        if( params["overview"])
	        	map.addControl(new GOverviewMapControl());
		
			if( params["doubleclickzoom"] != map.doubleClickZoomEnabled() ) {
				params["doubleclickzoom"] ? map.enableDoubleClickZoom() : map.disableDoubleClickZoom();
			}
			
			if( params["wheelzoom"] != map.scrollWheelZoomEnabled() ) {
				params["wheelzoom"] ? map.enableScrollWheelZoom() : maps.disableScrollWheelZoom();
			}
			
			if( params["drag"] != map.draggingEnabled() )
				params["drag"] ? map.enableDragging() : map.disableDragging();

            //set maptype
            var maptype = GMapData.getMapTypeForName(map, params["displaymap"]);
            map.setMapType(maptype);

            // Output known locations
            $(".location", params["_div"]).each( function() {
            	GMapData.addMarker( map, GMapData.pointFromInput(this.value), this.title);
            });
            
            // Find info for adresses
            $(".address", params["_div"]).each( function() {
            	GMapData.geocoder.getLatLng( this.value, (function(text) {
            		return function (point) {
            			GMapData.addMarker( map, point, text);
            		}
            	})( this.title ));
            });
            
            // Output driving directions
            $(".directions", params["div"]).each( function() {
                var directions = new GDirections(map);
                directions.load("from: " + this.value + " to: " + this.title );
            });             
		},
			
		getMapTypesFromInfo: function (mapTypes) {
			var result = new Array();
			
	        var mapNames = mapTypes.split(",");
	        for( var i=0; i<mapNames.length; i++ ) {
	        	var name = mapNames[i];
	        	
	        	for( var j=0; j<GMapData.availableMaps.length; j++ ) {
	        		var map = GMapData.availableMaps[j];
	        		if( map.getName() == name ) {
	        			result.push(map);
	        			break;
	        		}
	        	}
	        }
	        
	        return result;
		},
		
		getMapTypeForName: function (map, name) {
		    var maps = map.getMapTypes();
		    for(var i=0;i<maps.length;i++) {
				if(maps[i].getName() == name) {
					return maps[i];
				}
			}
		    
			//if it didn't work return the default type
		    return maps[0];
		},
    
		addMarker: function (map, point, text) {
		    var marker = new GMarker(point);
		    map.addOverlay(marker);
		    if( text ) {
		        GEvent.addListener(marker, 'click', function() {
		        	marker.openInfoWindowHtml("<b>Info: </b>" + text);
	            });
	        }
		},
	   
		pointFromInput: function (text) {
			var latlon = text.split(",");
			return new GLatLng( latlon[0], latlon[1] );
	    }
	};
	
	$("div.gmap").each( function() {

		// parse parameters
        var params = new Object();
        params["_div"] = this;
        
        $("input.parameters", this).each(function () {
            var value = this.value,
                id = this.name || this.id;
            if ($(this).hasClass("list")) {
                if (params[id]) {
                	params[id].push(value);
                } else {
                	params[id] = [value];
                }
            } else {
            	params[id] = (value.match(/^(tru|fals)e$/i) ? value.toLowerCase() == "true" : value);
            }
        });

        // Create and size the map area
        $(this).prepend( "<div name='map_canvas'></div>")
        var innerMap = $("[name=map_canvas]", this).get(0);
        $(innerMap).css( "width", params.width + "px" ).css( "height", params.height + "px");
        params["_innermap"] = innerMap;
        
        //geoCode address and show map 
        var center = $("[name=centeraddress]").get(0);
        if( center ) {
        	GMapData.geocoder.getLatLng(center.value, function( point ) { GMapData.setupMapFunction( params, point, center.title ); } );
        }
        else {
        	center = $("[name=centerlocation]").get(0);
        	if( center ) {
        		GMapData.setupMapFunction( params, GMapData.pointFromInput(center.value), center.title );
        	}
        	else {
        		GMapData.setupMapFunction( params );
        	}
        }
	});
});