<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>build.xml</filename>
    </added>
    <added>
      <filename>license.js</filename>
    </added>
    <added>
      <filename>tools/ant-contrib/ant-contrib-1.0b3.jar</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/README.txt</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Chain.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Dumper.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Hash.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Link.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Namespace.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Opt.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Reflection.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/String.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/frame/Testrun.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/handlers/FOODOC.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/handlers/XMLDOC.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/DocComment.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/DocTag.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Lang.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Parser.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Symbol.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/TextStream.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Token.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Util.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/lib/JSDOC/Walker.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/main.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/commentSrcJson.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/frameworkPrototype.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/functionCall.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/publishSrcHilite.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/symbolLink.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/tagParamConfig.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/plugins/tagSynonyms.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/run.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/t/TestDoc.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/t/runner.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/addon.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/anon_inner.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/augments.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/augments2.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/borrows.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/borrows2.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/config.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/constructs.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/encoding.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/encoding_other.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/event.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/functions_anon.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/functions_nested.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/global.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/globals.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/ignore.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/inner.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/jsdoc_test.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/lend.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/memberof.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/memberof_constructor.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/name.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/namespace_nested.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/nocode.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/oblit_anon.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/overview.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/param_inline.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/params_optional.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/prototype.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/prototype_nested.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/prototype_oblit.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/prototype_oblit_constructor.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/public.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/scripts/code.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/scripts/notcode.txt</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/shared.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/shared2.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/shortcuts.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/static_this.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/synonyms.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/tosource.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/app/test/variable_redefine.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/changes.txt</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/conf/sample.conf</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/java/build.xml</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/java/build_1.4.xml</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/java/classes/js.jar</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/java/src/JsDebugRun.java</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/java/src/JsRun.java</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/jsdebug.jar</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/jsrun.jar</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/jsrun.sh</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/mxn.conf</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/class.tmpl</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/index.tmpl</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/publish.js</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/static/default.css</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/static/header.html</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/static/index.html</filename>
    </added>
    <added>
      <filename>tools/jsdoc-toolkit/templates/jsdoc/symbol.tmpl</filename>
    </added>
    <added>
      <filename>tools/jslint/jslint.js</filename>
    </added>
    <added>
      <filename>tools/rhino/js.jar</filename>
    </added>
    <added>
      <filename>tools/yui-compressor/yuicompressor-2.4.2.jar</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -202,10 +202,10 @@ Mapstraction: {
 
 		// TODO: Add provider code
 
-		oContext.pixels.top = ...;
-		oContext.pixels.left = ...;
-		oContext.pixels.bottom = ...;
-		oContext.pixels.right = ...;
+		//oContext.pixels.top = ...;
+		//oContext.pixels.left = ...;
+		//oContext.pixels.bottom = ...;
+		//oContext.pixels.right = ...;
 	},
 	
 	addOverlay: function(url, autoCenterAndZoom) {</diff>
      <filename>source/mxn.(provider).core.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,14 @@
 (function(){
 
+/**
+ * @exports mxn.util.$m as $m
+ */
 var $m = mxn.util.$m;
 
 /**
  * Initialise our provider. This function should only be called 
  * from within mapstraction code, not exposed as part of the API.
+ * @private
  */
 var init = function() {
 	this.invoker.go('init', [ this.currentElement, this.api ]);
@@ -13,13 +17,17 @@ var init = function() {
 
 /**
  * Mapstraction instantiates a map with some API choice into the HTML element given
+ * @name mxn.Mapstraction
+ * @constructor
  * @param {String} element The HTML element to replace with a map
  * @param {String} api The API to use, one of 'google', 'yahoo', 'microsoft', 'openstreetmap', 'multimap', 'map24', 'openlayers', 'mapquest'. If omitted, first loaded provider implementation is used.
  * @param {Bool} debug optional parameter to turn on debug support - this uses alert panels for unsupported actions
- * @constructor
+ * @exports Mapstraction as mxn.Mapstraction
  */
- var Mapstraction = mxn.Mapstraction = function(element, api, debug) {
-    if (!api) api = mxn.util.getAvailableProviders()[0];
+var Mapstraction = mxn.Mapstraction = function(element, api, debug) {
+    if (!api){
+		api = mxn.util.getAvailableProviders()[0];
+	}
 	this.api = api;
 	this.maps = {};
 	this.currentElement = $m(element);
@@ -33,28 +41,78 @@ var init = function() {
 	
 	// option defaults
 	this.options = {
-		enableScrollWheelZoom: false
-	}
+		enableScrollWheelZoom: false,
+		enableDragging: true
+	};
 	
 	this.addControlsArgs = {};
 	
 	// set up our invoker for calling API methods
 	this.invoker = new mxn.Invoker(this, 'Mapstraction', function(){ return this.api; });
 	
+	// Adding our events
 	mxn.addEvents(this, [
-		'load',				// Map has loaded
-		'click',			// Map is clicked {location: LatLonPoint}
-		'endPan',			// Map is panned
-		'changeZoom',		// Zoom is changed
-		'markerAdded',		// Marker is removed {marker: Marker}
-		'markerRemoved',	// Marker is removed {marker: Marker}
-		'polylineAdded',	// Polyline is added {polyline: Polyline}
-		'polylineRemoved'	// Polyline is removed {polyline: Polyline}
+		
+		/**
+		 * Map has loaded
+		 * @name mxn.Mapstraction#load
+		 * @event
+		 */
+		'load',
+		
+		/**
+		 * Map is clicked {location: LatLonPoint}
+		 * @name mxn.Mapstraction#click
+		 * @event
+		 */
+		'click',
+		
+		/**
+		 * Map is panned
+		 * @name mxn.Mapstraction#endPan
+		 * @event
+		 */
+		'endPan',
+		
+		/**
+		 * Zoom is changed
+		 * @name mxn.Mapstraction#changeZoom
+		 * @event
+		 */
+		'changeZoom',
+		
+		/**
+		 * Marker is removed {marker: Marker}
+		 * @name mxn.Mapstraction#markerAdded
+		 * @event
+		 */
+		'markerAdded',
+		
+		/**
+		 * Marker is removed {marker: Marker}
+		 * @name mxn.Mapstraction#markerRemoved
+		 * @event
+		 */
+		'markerRemoved',
+		
+		/**
+		 * Polyline is added {polyline: Polyline}
+		 * @name mxn.Mapstraction#polylineAdded
+		 * @event
+		 */
+		'polylineAdded',
+		
+		/**
+		 * Polyline is removed {polyline: Polyline}
+		 * @name mxn.Mapstraction#polylineRemoved
+		 * @event
+		 */
+		'polylineRemoved'
 	]);
 	
 	// finally initialize our proper API map
 	init.apply(this);
-}
+};
 
 // Map type constants
 Mapstraction.ROAD = 1;
@@ -63,20 +121,189 @@ Mapstraction.HYBRID = 3;
 
 // methods that have no implementation in mapstraction core
 mxn.addProxyMethods(Mapstraction, [ 
-	'addLargeControls', 'addMarker', 'addMapTypeControls', 'addOverlay', 'addPolyline', 'addSmallControls', 'applyOptions',
-	'dragging', 
-	'getBounds', 'getCenter', 'getMapType', 'getPixelRatio', 'getZoom', 'getZoomLevelForBoundingBox', 
+	/**
+	 * Adds a large map panning control and zoom buttons to the map
+	 * @name mxn.Mapstraction#addLargeControls
+	 * @function
+	 */
+	'addLargeControls',
+		
+	/**
+	 * Adds a map type control to the map (streets, aerial imagery etc)
+	 * @name mxn.Mapstraction#addMapTypeControls
+	 * @function
+	 */
+	'addMapTypeControls', 
+	
+	/**
+	 * Adds a GeoRSS or KML overlay to the map
+	 *  some flavors of GeoRSS and KML are not supported by some of the Map providers
+	 * @name mxn.Mapstraction#addOverlay
+	 * @function
+	 * @param {String} url GeoRSS or KML feed URL
+	 * @param {Boolean} autoCenterAndZoom Set true to auto center and zoom after the feed is loaded
+	 */
+	'addOverlay', 
+	
+	/**
+	 * Adds a small map panning control and zoom buttons to the map
+	 * @name mxn.Mapstraction#addSmallControls
+	 * @function
+	 */
+	'addSmallControls', 
+	
+	/**
+	 * Applies the current option settings
+	 * @name mxn.Mapstraction#applyOptions
+	 * @function
+	 */
+	'applyOptions',
+	
+	/**
+	 * Gets the BoundingBox of the map
+	 * @name mxn.Mapstraction#getBounds
+	 * @function
+	 * @returns {BoundingBox} The bounding box for the current map state
+	 */
+	'getBounds', 
+	
+	/**
+	 * Gets the central point of the map
+	 * @name mxn.Mapstraction#getCenter
+	 * @function
+	 * @returns {LatLonPoint} The center point of the map
+	 */
+	'getCenter', 
+	
+	/**
+	 * Gets the imagery type for the map.
+	 * The type can be one of:
+	 *  mxn.Mapstraction.ROAD
+	 *  mxn.Mapstraction.SATELLITE
+	 *  mxn.Mapstraction.HYBRID
+	 * @name mxn.Mapstraction#getMapType
+	 * @function
+	 * @returns {Number} 
+	 */
+	'getMapType', 
+
+	/**
+	 * Returns a ratio to turn distance into pixels based on current projection
+	 * @name mxn.Mapstraction#getPixelRatio
+	 * @function
+	 * @returns {Float} ratio
+	 */
+	'getPixelRatio', 
+	
+	/**
+	 * Returns the zoom level of the map
+	 * @name mxn.Mapstraction#getZoom
+	 * @function
+	 * @returns {Integer} The zoom level of the map
+	 */
+	'getZoom', 
+	
+	/**
+	 * Returns the best zoom level for bounds given
+	 * @name mxn.Mapstraction#getZoomLevelForBoundingBox
+	 * @function
+	 * @param {BoundingBox} bbox The bounds to fit
+	 * @returns {Integer} The closest zoom level that contains the bounding box
+	 */
+	'getZoomLevelForBoundingBox', 
+	
+	/**
+	 * Displays the coordinates of the cursor in the HTML element
+	 * @name mxn.Mapstraction#mousePosition
+	 * @function
+	 * @param {String} element ID of the HTML element to display the coordinates in
+	 */
 	'mousePosition',
-	'resizeTo', 'removeMarker', 
-	'setBounds', 'setCenter', 'setCenterAndZoom', 'setMapType', 'setOption', 'setZoom',
+	
+	/**
+	 * Resize the current map to the specified width and height
+	 * (since it is actually on a child div of the mapElement passed
+	 * as argument to the Mapstraction constructor, the resizing of this
+	 * mapElement may have no effect on the size of the actual map)
+	 * @name mxn.Mapstraction#resizeTo
+	 * @function
+	 * @param {Integer} width The width the map should be.
+	 * @param {Integer} height The width the map should be.
+	 */
+	'resizeTo', 
+	
+	/**
+	 * Sets the map to the appropriate location and zoom for a given BoundingBox
+	 * @name mxn.Mapstraction#setBounds
+	 * @function
+	 * @param {BoundingBox} bounds The bounding box you want the map to show
+	 */
+	'setBounds', 
+	
+	/**
+	 * setCenter sets the central point of the map
+	 * @name mxn.Mapstraction#setCenter
+	 * @function
+	 * @param {LatLonPoint} point The point at which to center the map
+	 * @param {Object} options Optional parameters
+	 * @param {Boolean} options.pan Whether the map should move to the locations using a pan or just jump straight there
+	 */
+	'setCenter', 
+	
+	/**
+	 * Centers the map to some place and zoom level
+	 * @name mxn.Mapstraction#setCenterAndZoom
+	 * @function
+	 * @param {LatLonPoint} point Where the center of the map should be
+	 * @param {Integer} zoom The zoom level where 0 is all the way out.
+	 */
+	'setCenterAndZoom', 
+	
+	/**
+	 * Sets the imagery type for the map
+	 * The type can be one of:
+	 *  mxn.Mapstraction.ROAD
+	 *  mxn.Mapstraction.SATELLITE
+	 *  mxn.Mapstraction.HYBRID
+	 * @name mxn.Mapstraction#setMapType
+	 * @function
+	 * @param {Number} type 
+	 */
+	'setMapType', 
+	
+	/**
+	 * Sets the zoom level for the map
+	 * MS doesn't seem to do zoom=0, and Gg's sat goes closer than it's maps, and MS's sat goes closer than Y!'s
+	 * TODO: Mapstraction.prototype.getZoomLevels or something.
+	 * @name mxn.Mapstraction#setZoom
+	 * @function
+	 * @param {Number} zoom The (native to the map) level zoom the map to.
+	 */
+	'setZoom',
+	
+	/**
+	 * Turns a Tile Layer on or off
+	 * @name mxn.Mapstraction#toggleTileLayer
+	 * @function
+	 * @param {tile_url} url of the tile layer that was created.
+	 */
 	'toggleTileLayer'
 ]);
 
+/**
+ * Sets the current options to those specified in oOpts and applies them
+ * @param {Object} oOpts Hash of options to set
+ */
 Mapstraction.prototype.setOptions = function(oOpts){
 	mxn.util.merge(this.options, oOpts);
 	this.applyOptions();
 };
 
+/**
+ * Sets an option and applies it.
+ * @param {String} sOptName Option name
+ * @param vVal Option value
+ */
 Mapstraction.prototype.setOption = function(sOptName, vVal){
 	this.options[sOptName] = vVal;
 	this.applyOptions();
@@ -84,13 +311,22 @@ Mapstraction.prototype.setOption = function(sOptName, vVal){
 
 /**
  * Enable scroll wheel zooming
- * Currently only supported by Google
+ * @deprecated Use setOption instead.
  */
 Mapstraction.prototype.enableScrollWheelZoom = function() {
 	this.setOption('enableScrollWheelZoom', true);
 };
 
 /**
+ * Enable/disable dragging of the map
+ * @param {Boolean} on
+ * @deprecated Use setOption instead.
+ */
+Mapstraction.prototype.dragging = function(on) {
+	this.setOption('enableDragging', on);
+};
+
+/**
  * Change the current api on the fly
  * @param {String} api The API to swap to
  * @param element
@@ -138,13 +374,9 @@ Mapstraction.prototype.swap = function(element,api) {
 
 };
 
-
-
-
 /**
  * Returns the loaded state of a Map Provider
  * @param {String} api Optional API to query for. If not specified, returns state of the originally created API
- * @type {Boolean} The state of the map loading
  */
 Mapstraction.prototype.isLoaded = function(api){
 	if (api === null) {
@@ -156,7 +388,6 @@ Mapstraction.prototype.isLoaded = function(api){
 /**
  * Set the debugging on or off - shows alert panels for functions that don't exist in Mapstraction
  * @param {Boolean} debug true to turn on debugging, false to turn it off
- * @type {Boolean} The state of debugging
  */
 Mapstraction.prototype.setDebug = function(debug){
 	if(debug !== null) {
@@ -256,7 +487,6 @@ Mapstraction.prototype.callEventListeners = function(sEventType, oEventArgs) {
  *	 scale:	true,
  *	 map_type: true,
  * }
- *
  * @param {array} args Which controls to switch on
  */
 Mapstraction.prototype.addControls = function( args ) {
@@ -378,6 +608,8 @@ Mapstraction.prototype.declutterMarkers = function(opts) {
 		//	case 'map24':
 		//
 		//	  break;
+		case '  dummy':
+			break;
 		default:
 			if(this.debug) {
 				alert(this.api + ' not supported by Mapstraction.declutterMarkers');
@@ -401,7 +633,8 @@ Mapstraction.prototype.addPolyline = function(polyline, old) {
 	this.polylineAdded.fire({'polyline': polyline});
 };
 
-Mapstraction.prototype.removePolylineImpl = function(polyline) {
+// Private remove implementation
+var removePolylineImpl = function(polyline) {
 	this.invoker.go('removePolyline', arguments);
 	polyline.onmap = false;
 	this.polylineRemoved.fire({'polyline': polyline});
@@ -417,7 +650,7 @@ Mapstraction.prototype.removePolyline = function(polyline) {
 		current_polyline = this.polylines[i];
 		if(polyline == current_polyline) {
 			this.polylines.splice(i, 1);
-			this.removePolylineImpl(polyline);
+			removePolylineImpl.call(this, polyline);
 			break;
 		}
 	}
@@ -430,7 +663,7 @@ Mapstraction.prototype.removeAllPolylines = function() {
 	var current_polyline;
 	while(this.polylines.length &gt; 0) {
 		current_polyline = this.polylines.pop();
-		this.removePolylineImpl(current_polyline);
+		removePolylineImpl.call(this, current_polyline);
 	}
 };
 
@@ -463,7 +696,7 @@ Mapstraction.prototype.autoCenterAndZoom = function() {
 		lon = this.markers[i].location.lon;
 		checkMinMax();
 	}
-	for (var i = 0; i &lt; this.polylines.length; i++) {
+	for(i = 0; i &lt; this.polylines.length; i++) {
 		for (var j = 0; j &lt; this.polylines[i].points.length; j++) {
 			lat = this.polylines[i].points[j].lat;
 			lon = this.polylines[i].points[j].lon;
@@ -498,16 +731,26 @@ Mapstraction.prototype.visibleCenterAndZoom = function() {
 	var lat_min = 90;
 	var lon_max = -180;
 	var lon_min = 180;
-
+	var lat, lon;
+	var checkMinMax = function(){
+		if (lat &gt; lat_max) {
+			lat_max = lat;
+		}
+		if (lat &lt; lat_min) {
+			lat_min = lat;
+		}
+		if (lon &gt; lon_max) {
+			lon_max = lon;
+		}
+		if (lon &lt; lon_min) {
+			lon_min = lon;
+		}
+	};
 	for (var i=0; i&lt;this.markers.length; i++) {
 		if (this.markers[i].getAttribute(&quot;visible&quot;)) {
 			lat = this.markers[i].location.lat;
 			lon = this.markers[i].location.lon;
-
-			if (lat &gt; lat_max) lat_max = lat;
-			if (lat &lt; lat_min) lat_min = lat;
-			if (lon &gt; lon_max) lon_max = lon;
-			if (lon &lt; lon_min) lon_min = lon;
+			checkMinMax();
 		}
 	}
 
@@ -516,11 +759,7 @@ Mapstraction.prototype.visibleCenterAndZoom = function() {
 			for (j=0; j&lt;this.polylines[i].points.length; j++) {
 				lat = this.polylines[i].points[j].lat;
 				lon = this.polylines[i].points[j].lon;
-
-				if (lat &gt; lat_max) lat_max = lat;
-				if (lat &lt; lat_min) lat_min = lat;
-				if (lon &gt; lon_max) lon_max = lon;
-				if (lon &lt; lon_min) lon_min = lon;
+				checkMinMax();
 			}
 		}
 	}
@@ -539,9 +778,9 @@ Mapstraction.prototype.polylineCenterAndZoom = function(radius) {
 	var lon_max = -180;
 	var lon_min = 180;
 
-	for (i=0; i &lt; mapstraction.polylines.length; i++)
+	for (var i=0; i &lt; mapstraction.polylines.length; i++)
 	{
-		for (j=0; j&lt;mapstraction.polylines[i].points.length; j++)
+		for (var j=0; j&lt;mapstraction.polylines[i].points.length; j++)
 		{
 			lat = mapstraction.polylines[i].points[j].lat;
 			lon = mapstraction.polylines[i].points[j].lon;
@@ -554,10 +793,18 @@ Mapstraction.prototype.polylineCenterAndZoom = function(radius) {
 				lonConv = (radius / mapstraction.polylines[i].points[j].lonConv());
 			}
 
-			if ((lat + latConv) &gt; lat_max) lat_max = (lat + latConv);
-			if ((lat - latConv) &lt; lat_min) lat_min = (lat - latConv);
-			if ((lon + lonConv) &gt; lon_max) lon_max = (lon + lonConv);
-			if ((lon - lonConv) &lt; lon_min) lon_min = (lon - lonConv);
+			if ((lat + latConv) &gt; lat_max) {
+				lat_max = (lat + latConv);
+			}
+			if ((lat - latConv) &lt; lat_min) {
+				lat_min = (lat - latConv);
+			}
+			if ((lon + lonConv) &gt; lon_max) {
+				lon_max = (lon + lonConv);
+			}
+			if ((lon - lonConv) &lt; lon_min) {
+				lon_min = (lon - lonConv);
+			}
 		}
 	}
 
@@ -669,7 +916,6 @@ Mapstraction.prototype.addJSON = function(json) {
 					date : &quot;new Date(\&quot;&quot;+item.date+&quot;\&quot;)&quot;,
 					iconShadow : item.icon_shadow,
 					marker : item.id,
-					date : &quot;new Date(\&quot;&quot;+item.date+&quot;\&quot;)&quot;,
 					iconShadowSize : item.icon_shadow_size,
 					icon : &quot;http://boston.openguides.org/markers/AQUA.png&quot;,
 					iconSize : item.icon_size,
@@ -691,6 +937,7 @@ Mapstraction.prototype.addJSON = function(json) {
 					polygon : true
 				});
 				markers.push(polyline);
+				break;
 			default:
 		// console.log(&quot;Geometry: &quot; + features.items[i].geometry.type);
 		}
@@ -801,65 +1048,51 @@ Mapstraction.prototype.removeAllFilters = function() {
  * @returns {Int} count of visible markers
  */
 Mapstraction.prototype.doFilter = function(showCallback, hideCallback) {
-	if(this.loaded[this.api] === false) {
-		var me = this;
-		this.onload[this.api].push( function() {
-			me.doFilter(showCallback, hideCallback);
-		} );
-		return;
-	}
-
 	var map = this.maps[this.api];
-
 	var visibleCount = 0;
-
+	var f;
 	if (this.filters) {
 		switch (this.api) {
 			case 'multimap':
 				/* TODO polylines aren't filtered in multimap */
 				var mmfilters = [];
-				for (var f=0; f&lt;this.filters.length; f++) {
+				for (f=0; f&lt;this.filters.length; f++) {
 					mmfilters.push( new MMSearchFilter( this.filters[f][0], this.filters[f][1], this.filters[f][2] ));
 				}
 				map.setMarkerFilters( mmfilters );
 				map.redrawMap();
 				break;
+			case '  dummy':
+				break;
 			default:
 				var vis;
 				for (var m=0; m&lt;this.markers.length; m++) {
 					vis = true;
-					for (var f = 0; f &lt; this.filters.length; f++) {
+					for (f = 0; f &lt; this.filters.length; f++) {
 						if (! this.applyFilter(this.markers[m], this.filters[f])) {
 							vis = false;
 						}
 					}
 					if (vis) {
 						visibleCount ++;
-						if (showCallback) showCallback(this.markers[m]);
-						else this.markers[m].show();
-					} else { 
-						if (hideCallback) hideCallback(this.markers[m]);
-						else this.markers[m].hide();
+						if (showCallback){
+							showCallback(this.markers[m]);
+						}
+						else {
+							this.markers[m].show();
+						}
+					} 
+					else { 
+						if (hideCallback){
+							hideCallback(this.markers[m]);
+						}
+						else {
+							this.markers[m].hide();
+						}
 					}
 
 					this.markers[m].setAttribute(&quot;visible&quot;, vis);
 				}
-
-				/*
-					 for (var p=0; m&lt;this.polylines.length; p++) {
-					 vis = true;
-					 for (var f=0; f&lt;this.filters.length; f++) {
-					 if (! this.applyFilter(this.polylines[p], this.filters[f])) {
-					 vis = false;
-					 }
-					 }
-					 if (vis) {
-					 this.polylines[p].show();
-					 } else {
-					 this.polylines[p].hide();
-					 }
-					 }
-				 */
 				break;
 		}
 	}
@@ -935,10 +1168,11 @@ Mapstraction.prototype.getMap = function() {
 
 /**
  * LatLonPoint is a point containing a latitude and longitude with helper methods
+ * @name mxn.LatLonPoint
+ * @constructor
  * @param {double} lat is the latitude
  * @param {double} lon is the longitude
- * @returns a new LatLonPoint
- * @type LatLonPoint
+ * @exports LatLonPoint as mxn.LatLonPoint
  */
 var LatLonPoint = mxn.LatLonPoint = function(lat, lon) {
 	// TODO error if undefined?
@@ -997,7 +1231,7 @@ LatLonPoint.prototype.equals = function(otherPoint) {
  */
 LatLonPoint.prototype.latConv = function() {
 	return this.distance(new LatLonPoint(this.lat + 0.1, this.lon))*10;
-}
+};
 
 /**
  * Returns longitude conversion based on current projection
@@ -1005,7 +1239,7 @@ LatLonPoint.prototype.latConv = function() {
  */
 LatLonPoint.prototype.lonConv = function() {
 	return this.distance(new LatLonPoint(this.lat, this.lon + 0.1))*10;
-}
+};
 
 
 //////////////////////////
@@ -1016,21 +1250,20 @@ LatLonPoint.prototype.lonConv = function() {
 
 /**
  * BoundingBox creates a new bounding box object
+ * @name mxn.BoundingBox
+ * @constructor
  * @param {double} swlat the latitude of the south-west point
  * @param {double} swlon the longitude of the south-west point
  * @param {double} nelat the latitude of the north-east point
  * @param {double} nelon the longitude of the north-east point
- * @returns a new BoundingBox
- * @type BoundingBox
- * @constructor
- * @classDescription BoundingBox
+ * @exports BoundingBox as mxn.BoundingBox
  */
 var BoundingBox = mxn.BoundingBox = function(swlat, swlon, nelat, nelon) {
 	//FIXME throw error if box bigger than world
 	//alert('new bbox ' + swlat + ',' +  swlon + ',' +  nelat + ',' + nelon);
 	this.sw = new LatLonPoint(swlat, swlon);
 	this.ne = new LatLonPoint(nelat, nelon);
-}
+};
 
 /**
  * getSouthWest returns a LatLonPoint of the south-west point of the bounding box
@@ -1105,8 +1338,10 @@ BoundingBox.prototype.extend = function(point) {
 
 /**
  * Marker create's a new marker pin
- * @param {LatLonPoint} point the point on the map where the marker should go
+ * @name mxn.Marker
  * @constructor
+ * @param {LatLonPoint} point the point on the map where the marker should go
+ * @exports Marker as mxn.Marker
  */
 var Marker = mxn.Marker = function(point) {
 	this.api = null;
@@ -1121,7 +1356,7 @@ var Marker = mxn.Marker = function(point) {
 		'closeInfoBubble', 	// Info bubble closed
 		'click'				// Marker clicked
 	]);
-}
+};
 
 mxn.addProxyMethods(Marker, [ 
 	'fromProprietary',
@@ -1147,53 +1382,58 @@ Marker.prototype.setLabel = function(labelText) {
  */
 Marker.prototype.addData = function(options){
 	for(var sOptKey in options) {
-		switch(sOptKey) {
-			case 'label':
-				this.setLabel(options.label);
-				break;
-			case 'infoBubble':
-				this.setInfoBubble(options.infoBubble);
-				break;
-			case 'icon':
-				if(options.iconSize &amp;&amp; options.iconAnchor) {
-					this.setIcon(options.icon, options.iconSize, options.iconAnchor);
-				}
-				else if(options.iconSize) {
-					this.setIcon(options.icon, options.iconSize);
-				}
-				else {
-					this.setIcon(options.icon);
-				}
-				break;
-			case 'iconShadow':
-				if(options.iconShadowSize)
-					this.setShadowIcon(options.iconShadow, new Array(options.iconShadowSize[0], options.iconShadowSize[1]));
-				else
-					this.setIcon(options.iconShadow);
-				break;
-			case 'infoDiv':
-				this.setInfoDiv(options.infoDiv[0],options.infoDiv[1]);
-				break;
-			case 'draggable':
-				this.setDraggable(options.draggable);
-				break;
-			case 'hover':
-				this.setHover(options.hover);
-			// no break statement here intentionally
-			case 'hoverIcon':
-				this.setHoverIcon(options.hoverIcon);
-				break;
-			case 'openBubble':
-				this.openBubble();
-				break;
-			case 'groupName':
-				this.setGroupName(options.groupName);
-				break;
-			default:
-				// don't have a specific action for this bit of
-				// data so set a named attribute
-				this.setAttribute(sOptKey, options[sOptKey]);
-				break;
+		if(options.hasOwnProperty(sOptKey)){
+			switch(sOptKey) {
+				case 'label':
+					this.setLabel(options.label);
+					break;
+				case 'infoBubble':
+					this.setInfoBubble(options.infoBubble);
+					break;
+				case 'icon':
+					if(options.iconSize &amp;&amp; options.iconAnchor) {
+						this.setIcon(options.icon, options.iconSize, options.iconAnchor);
+					}
+					else if(options.iconSize) {
+						this.setIcon(options.icon, options.iconSize);
+					}
+					else {
+						this.setIcon(options.icon);
+					}
+					break;
+				case 'iconShadow':
+					if(options.iconShadowSize) {
+						this.setShadowIcon(options.iconShadow, [ options.iconShadowSize[0], options.iconShadowSize[1] ]);
+					}
+					else {
+						this.setIcon(options.iconShadow);
+					}
+					break;
+				case 'infoDiv':
+					this.setInfoDiv(options.infoDiv[0],options.infoDiv[1]);
+					break;
+				case 'draggable':
+					this.setDraggable(options.draggable);
+					break;
+				case 'hover':
+					this.setHover(options.hover);
+					this.setHoverIcon(options.hoverIcon);
+					break;
+				case 'hoverIcon':
+					this.setHoverIcon(options.hoverIcon);
+					break;
+				case 'openBubble':
+					this.openBubble();
+					break;
+				case 'groupName':
+					this.setGroupName(options.groupName);
+					break;
+				default:
+					// don't have a specific action for this bit of
+					// data so set a named attribute
+					this.setAttribute(sOptKey, options[sOptKey]);
+					break;
+			}
 		}
 	}
 };
@@ -1312,7 +1552,13 @@ Marker.prototype.getAttribute = function(key) {
 // Polyline ///
 ///////////////
 
-
+/**
+ * Instantiates a new Polyline.
+ * @name mxn.Polyline
+ * @constructor
+ * @param {Point[]} points Points that make up the Polyline.
+ * @exports Polyline as mxn.Polyline
+ */
 var Polyline = mxn.Polyline = function(points) {
 	this.api = null;
 	this.points = points;
@@ -1321,7 +1567,7 @@ var Polyline = mxn.Polyline = function(points) {
 	this.proprietary_polyline = false;
 	this.pllID = &quot;mspll-&quot;+new Date().getTime()+'-'+(Math.floor(Math.random()*Math.pow(2,16)));
 	this.invoker = new mxn.Invoker(this, 'Polyline', function(){return this.api;});
-}
+};
 
 mxn.addProxyMethods(Polyline, [ 
 	'fromProprietary', 
@@ -1336,25 +1582,27 @@ mxn.addProxyMethods(Polyline, [
  */
 Polyline.prototype.addData = function(options){
 	for(var sOpt in options) {
-		switch(sOpt) {
-			case 'color':
-				this.setColor(options.color);
-				break;
-			case 'width':
-				this.setWidth(options.width);
-				break;
-			case 'opacity':
-				this.setOpacity(options.opacity);
-				break;
-			case 'closed':
-				this.setClosed(options.closed);
-				break;
-			case 'fillColor':
-				this.setFillColor(options.fillColor);
-				break;
-			default:
-				this.setAttribute(sOpt, options[sOpt]);
-				break;
+		if(options.hasOwnProperty(sOpt)){
+			switch(sOpt) {
+				case 'color':
+					this.setColor(options.color);
+					break;
+				case 'width':
+					this.setWidth(options.width);
+					break;
+				case 'opacity':
+					this.setOpacity(options.opacity);
+					break;
+				case 'closed':
+					this.setClosed(options.closed);
+					break;
+				case 'fillColor':
+					this.setFillColor(options.fillColor);
+					break;
+				default:
+					this.setAttribute(sOpt, options[sOpt]);
+					break;
+			}
 		}
 	}
 };
@@ -1428,19 +1676,20 @@ Polyline.prototype.getAttribute = function(key) {
  * @param {Integer} tolerance (1.0 is a good starting point)
  */
 Polyline.prototype.simplify = function(tolerance) {
-	var reduced = new Array();
+	var reduced = [];
 
 	// First point
 	reduced[0] = this.points[0];
 
 	var markerPoint = 0;
 
-	for (var i = 1; i &lt; this.points.length-1; i++)
+	for (var i = 1; i &lt; this.points.length-1; i++){
 		if (this.points[i].distance(this.points[markerPoint]) &gt;= tolerance)
 		{
 			reduced[reduced.length] = this.points[i];
 			markerPoint = i;
 		}
+	}
 
 	// Last point
 	reduced[reduced.length] = this.points[this.points.length-1];</diff>
      <filename>source/mxn.core.js</filename>
    </modified>
    <modified>
      <diff>@@ -47,10 +47,18 @@ Mapstraction: {
 	
 	applyOptions: function(){
 		var map = this.maps[this.api];
+		
 		if(this.options.enableScrollWheelZoom){
 			map.enableContinuousZoom();
 			map.enableScrollWheelZoom();
 		}
+		
+		if (this.options.enableDragging) {
+			map.enableDragging();
+		} else {
+			map.disableDragging();
+		}
+		
 	},
 
 	resizeTo: function(width, height){	
@@ -119,15 +127,6 @@ Mapstraction: {
 		map.addControl(new GMapTypeControl());  
 	},
 
-	dragging: function(on) {
-		var map = this.maps[this.api];
-		if (on) {
-			map.enableDragging();
-		} else {
-			map.disableDragging();
-		}
-	},
-
 	setCenterAndZoom: function(point, zoom) { 
 		var map = this.maps[this.api];
 		var pt = point.toProprietary(this.api);
@@ -387,6 +386,7 @@ LatLonPoint: {
 Marker: {
 	
 	toProprietary: function() {
+		var infoBubble, event_action, infoDiv, div;
 		var options = {};
 		if(this.labelText){
 			options.title =  this.labelText;
@@ -420,8 +420,7 @@ Marker: {
 		var gmarker = new GMarker( this.location.toProprietary('google'),options);
 				
 		if(this.infoBubble){
-			var theInfo = this.infoBubble;
-			var event_action;
+			infoBubble = this.infoBubble;
 			if(this.hover) {
 				event_action = &quot;mouseover&quot;;
 			}
@@ -429,7 +428,7 @@ Marker: {
 				event_action = &quot;click&quot;;
 			}
 			GEvent.addListener(gmarker, event_action, function() {
-				gmarker.openInfoWindowHtml(theInfo, {
+				gmarker.openInfoWindowHtml(infoBubble, {
 					maxWidth: 100
 				});
 			});
@@ -445,9 +444,8 @@ Marker: {
 		}
 
 		if(this.infoDiv){
-			var theInfo = this.infoDiv;
-			var div = this.div;
-			var event_action;
+			infoDiv = this.infoDiv;
+			div = this.div;
 			if(this.hover) {
 				event_action = &quot;mouseover&quot;;
 			}
@@ -455,7 +453,7 @@ Marker: {
 				event_action = &quot;click&quot;;
 			}
 			GEvent.addListener(gmarker, event_action, function() {
-				document.getElementById(div).innerHTML = theInfo;
+				document.getElementById(div).innerHTML = infoDiv;
 			});
 		}
 </diff>
      <filename>source/mxn.google.core.js</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,7 @@ var apis = {};
 // Our special private methods
 /**
  * Calls the API specific implementation of a particular method.
+ * @private
  */
 var invoke = function(sApiId, sObjName, sFnName, oScope, args){
 	if(!hasImplementation(sApiId, sObjName, sFnName)) {
@@ -17,6 +18,7 @@ var invoke = function(sApiId, sObjName, sFnName, oScope, args){
 /**
  * Determines whether the specified API provides an implementation for the 
  * specified object and function name.
+ * @private
  */
 var hasImplementation = function(sApiId, sObjName, sFnName){
 	if(typeof(apis[sApiId]) == 'undefined') {
@@ -28,19 +30,29 @@ var hasImplementation = function(sApiId, sObjName, sFnName){
 	return typeof(apis[sApiId][sObjName][sFnName]) == 'function';
 };
 
-var mxn = window.mxn = {
+/**
+ * @name mxn
+ * @namespace
+ */
+var mxn = window.mxn = /** @lends mxn */ {
 	
 	/**
 	 * Registers a set of provider specific implementation functions.
+	 * @function
+	 * @param {String} sApiId The API ID to register implementing functions for.
+	 * @param {Object} oApiImpl An object containing the API implementation.
 	 */
 	register: function(sApiId, oApiImpl){
-		if(!apis.hasOwnProperty(sApiId)) apis[sApiId] = {};
+		if(!apis.hasOwnProperty(sApiId)){
+			apis[sApiId] = {};
+		}
 		mxn.util.merge(apis[sApiId], oApiImpl);
 	},		
 	
 	/**
 	 * Adds a list of named proxy methods to the prototype of a 
 	 * specified constructor function.
+	 * @function
 	 * @param {Function} func Constructor function to add methods to
 	 * @param {Array} aryMethods Array of method names to create
 	 * @param {Boolean} bWithApiArg Optional. Whether the proxy methods will use an API argument
@@ -70,11 +82,16 @@ var mxn = window.mxn = {
 			
 	/**
 	 * Bulk add some named events to an object.
+	 * @function
+	 * @param {Object} oEvtSrc The event source object.
+	 * @param {String[]} aEvtNames Event names to add.
 	 */
 	addEvents: function(oEvtSrc, aEvtNames){
 		for(var i = 0; i &lt; aEvtNames.length; i++){
 			var sEvtName = aEvtNames[i];
-			if(sEvtName in oEvtSrc) throw 'Event or method ' + sEvtName + ' already declared.';
+			if(sEvtName in oEvtSrc){
+				throw 'Event or method ' + sEvtName + ' already declared.';
+			}
 			oEvtSrc[sEvtName] = new mxn.Event(sEvtName, oEvtSrc);
 		}
 	}
@@ -82,15 +99,29 @@ var mxn = window.mxn = {
 };
 
 /**
- * Event 
+ * Instantiates a new Event 
  * @constructor
+ * @param {String} sEvtName The name of the event.
+ * @param {Object} oEvtSource The source object of the event.
  */
 mxn.Event = function(sEvtName, oEvtSource){
 	var handlers = [];
-	if(!sEvtName) throw 'Event name must be provided';
+	if(!sEvtName){
+		throw 'Event name must be provided';
+	}
+	/**
+	 * Add a handler to the Event.
+	 * @param {Function} fn The handler function.
+	 * @param {Object} ctx The context of the handler function.
+	 */
 	this.addHandler = function(fn, ctx){
 		handlers.push({context: ctx, handler: fn});
 	};
+	/**
+	 * Remove a handler from the Event.
+	 * @param {Function} fn The handler function.
+	 * @param {Object} ctx The context of the handler function.
+	 */
 	this.removeHandler = function(fn, ctx){
 		for(var i = 0; i &lt; handlers.length; i++){
 			if(handlers[i].handler == fn &amp;&amp; handlers[i].context == ctx){
@@ -98,15 +129,22 @@ mxn.Event = function(sEvtName, oEvtSource){
 			}
 		}
 	};
+	/**
+	 * Remove all handlers from the Event.
+	 */
 	this.removeAllHandlers = function(){
 		handlers = [];
 	};
+	/**
+	 * Fires the Event.
+	 * @param {Object} oEvtArgs Event arguments object to be passed to the handlers.
+	 */
 	this.fire = function(oEvtArgs){
 		var args = [sEvtName, oEvtSource, oEvtArgs];
 		for(var i = 0; i &lt; handlers.length; i++){
 			handlers[i].handler.apply(handlers[i].context, args);
 		}
-	}
+	};
 };
 
 /**
@@ -131,7 +169,10 @@ mxn.Invoker = function(aobj, asClassName, afnApiIdGetter){
 	 * Invoke the API implementation of a specific method.
 	 * @param {String} sMethodName The method name to invoke
 	 * @param {Array} args Arguments to pass on
-	 * @param {String} oOptions Optional. Extra options for invocation
+	 * @param {Object} oOptions Optional. Extra options for invocation
+	 * @param {Boolean} oOptions.overrideApi When true the first argument is used as the API ID.
+	 * @param {Object} oOptions.context A context object for passing extra information on to the provider implementation.
+	 * @param {Function} oOptions.fallback A fallback function to run if the provider implementation is missing.
 	 */
 	this.go = function(sMethodName, args, oOptions){
 		
@@ -141,8 +182,9 @@ mxn.Invoker = function(aobj, asClassName, afnApiIdGetter){
 						
 		var sApiId = oOptions.overrideApi ? args[0] : fnApiIdGetter.apply(obj);
 		
-		if(typeof(sApiId) != 'string') 
+		if(typeof(sApiId) != 'string'){
 			throw 'API ID not available.';
+		}
 		
 		if(typeof(oOptions.context) != 'undefined' &amp;&amp; oOptions.context !== null){
 			// make sure args is an array
@@ -162,7 +204,9 @@ mxn.Invoker = function(aobj, asClassName, afnApiIdGetter){
 	
 };
 
-
+/**
+ * @namespace
+ */
 mxn.util = {
 			
 	/**
@@ -171,13 +215,15 @@ mxn.util = {
 	 * @param {Object} oGive The object donating properties
 	 */
 	merge: function(oRecv, oGive){
-		for (var sPropName in oGive) if (oGive.hasOwnProperty(sPropName)) {
-			if(!oRecv.hasOwnProperty(sPropName)){
-				oRecv[sPropName] = oGive[sPropName];
+		for (var sPropName in oGive){
+			if (oGive.hasOwnProperty(sPropName)) {
+				if(!oRecv.hasOwnProperty(sPropName)){
+					oRecv[sPropName] = oGive[sPropName];
+				}
+				else {
+					mxn.util.merge(oRecv[sPropName], oGive[sPropName]);
+				}
 			}
-			else {
-				mxn.util.merge(oRecv[sPropName], oGive[sPropName]);
-			}			
 		}
 	},
 	
@@ -352,12 +398,21 @@ mxn.util = {
 	 */
 	getAvailableProviders : function () {
 		var providers = [];
-		for (var propertyName in apis) providers.push(propertyName);
+		for (var propertyName in apis){
+			if (apis.hasOwnProperty(propertyName)) {
+				providers.push(propertyName);
+			}
+		}
 		return providers;
 	}
 	
 };
 
+/**
+ * Class for converting between HTML and RGB integer color formats.
+ * Accepts either a HTML color string argument or three integers for R, G and B.
+ * @constructor
+ */
 mxn.util.Color = function() {	
 	if(arguments.length == 3) {
 		this.red = arguments[0];
@@ -371,6 +426,10 @@ mxn.util.Color = function() {
 
 mxn.util.Color.prototype.reHex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
 
+/**
+ * Set the color from the supplied HTML hex string.
+ * @param {String} strHexColor A HTML hex color string e.g. '#00FF88'.
+ */
 mxn.util.Color.prototype.setHexColor = function(strHexColor) {
 	var match = strHexColor.match(this.reHex);
 	if(match) {
@@ -387,6 +446,10 @@ mxn.util.Color.prototype.setHexColor = function(strHexColor) {
 	this.blue = parseInt(strHexColor.substr(4,2), 16);
 };
 
+/**
+ * Retrieve the color value as an HTML hex string.
+ * @returns {String} Format '00FF88' - note no preceding #.
+ */
 mxn.util.Color.prototype.getHexColor = function() {
 	var vals = [this.red.toString(16), this.green.toString(16), this.blue.toString(16)];
 	for(var i = 0; i &lt; vals.length; i++) {
@@ -410,21 +473,25 @@ mxn.util.Color.prototype.getHexColor = function() {
 	
 	for (var i = 0; i &lt; scripts.length; i++) {
 		var match = scripts[i].src.replace(/%20/g , '').match(/^(.*?)mxn\.js(\?\(\[?(.*?)\]?\))?$/);
-		if (match != null) {
+		if (match !== null) {
 			scriptBase = match[1];
 			if (match[3]) {
 				var settings = match[3].split(',[');
 				providers = settings[0].replace(']' , '');
-				if (settings[1]) modules = settings[1];
+				if (settings[1]){
+					modules = settings[1];
+				}
 			}
 			break;
 	   }
 	}
 	providers = providers.replace(/ /g, '').split(',');
 	modules = modules.replace(/ /g, '').split(',');
-	for (var i = 0; i &lt; modules.length; i++) {	
+	for (i = 0; i &lt; modules.length; i++) {	
 		mxn.util.loadScript(scriptBase + 'mxn.' + modules[i] + '.js');
-		for (var j = 0; j &lt; providers.length; j++) mxn.util.loadScript(scriptBase + 'mxn.' + providers[j] + '.' + modules[i] + '.js');
+		for (var j = 0; j &lt; providers.length; j++){
+			mxn.util.loadScript(scriptBase + 'mxn.' + providers[j] + '.' + modules[i] + '.js');
+		}
 	}
 
 })();</diff>
      <filename>source/mxn.js</filename>
    </modified>
    <modified>
      <diff>@@ -32,10 +32,14 @@ Mapstraction: {
 	},
 	
 	applyOptions: function(){
-		if(this.options.enableScrollWheelZoom){
-			map.enableContinuousZoom();
-			map.enableScrollWheelZoom();
-		}
+		
+		/*
+		if (this.options.enableDragging) {
+			map.enableDragMap();
+		} else {
+			map.disableDragMap();
+		}*/
+		
 	},
 
 	resizeTo: function(width, height){	
@@ -285,22 +289,27 @@ LatLonPoint: {
 Marker: {
 	
 	toProprietary: function() {
-		var ymarker;
-	    var size;
+		var ymarker, size;
+		var infoBubble, event_action, infoDiv, div;
+		
 	    if(this.iconSize) {
 	        size = new YSize(this.iconSize[0], this.iconSize[1]);
 	    }
 	    if(this.iconUrl) {
-	        if(this.iconSize)
+	        if(this.iconSize){
 	            ymarker = new YMarker(this.location.toProprietary('yahoo'), new YImage(this.iconUrl, size));
-	        else
+			}
+	        else {
 	            ymarker = new YMarker(this.location.toProprietary('yahoo'), new YImage(this.iconUrl));
+			}
 	    }
 	    else {
-	        if(this.iconSize)
+	        if(this.iconSize) {
 	            ymarker = new YMarker(this.location.toProprietary('yahoo'), null, size);
-	        else
+			}
+	        else {
 	            ymarker = new YMarker(this.location.toProprietary('yahoo'));
+			}
 	    }
 
 	    if(this.labelText) {
@@ -308,8 +317,7 @@ Marker: {
 	    }
 
 	    if(this.infoBubble) {
-	        var theInfo = this.infoBubble;
-	        var event_action;
+	        infoBubble = this.infoBubble;
 	        if(this.hover) {
 	            event_action = EventsList.MouseOver;
 	        }
@@ -317,15 +325,14 @@ Marker: {
 	            event_action = EventsList.MouseClick;
 	        }
 	        YEvent.Capture(ymarker, event_action, function() {
-	            ymarker.openSmartWindow(theInfo);
+	            ymarker.openSmartWindow(infoBubble);
 	        });
 
 	    }
 
 	    if(this.infoDiv) {
-	        var theInfo = this.infoDiv;
-	        var div = this.div;
-	        var event_div;
+	        infoDiv = this.infoDiv;
+	        div = this.div;
 	        if(this.hover) {
 	            event_action = EventsList.MouseOver;
 	        }
@@ -333,7 +340,7 @@ Marker: {
 	            event_action = EventsList.MouseClick;
 	        }
 	        YEvent.Capture(ymarker, event_action, function() {
-	            document.getElementById(div).innerHTML = theInfo;
+	            document.getElementById(div).innerHTML = infoDiv;
 	        });
 	    }
 </diff>
      <filename>source/mxn.yahoo.core.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>036be4da3b642c0294aeefdcec14fff7d2554645</id>
    </parent>
  </parents>
  <author>
    <name>dezfowler</name>
    <email>dezfowler@5785637c-5c24-0410-85b3-eb650f34d106</email>
  </author>
  <url>http://github.com/mapstraction/mxn/commit/bbcab81519017dea71391a5915814523b9a1ff10</url>
  <id>bbcab81519017dea71391a5915814523b9a1ff10</id>
  <committed-date>2009-08-16T17:18:10-07:00</committed-date>
  <authored-date>2009-08-16T17:18:10-07:00</authored-date>
  <message>Got mxn.js and mxn.core.js linting.
Added an ant build process (lint, doc, min, license).

git-svn-id: https://mapstraction.googlecode.com/svn/trunk@18 5785637c-5c24-0410-85b3-eb650f34d106</message>
  <tree>e7a22f167b47155447df9eb1ff29c34ade374553</tree>
  <committer>
    <name>dezfowler</name>
    <email>dezfowler@5785637c-5c24-0410-85b3-eb650f34d106</email>
  </committer>
</commit>
