[fusion-commits] r2143 - sandbox/adsk/2.2gp/lib/OpenLayers trunk/lib/OpenLayers

svn_fusion at osgeo.org svn_fusion at osgeo.org
Thu Apr 15 16:05:31 EDT 2010


Author: chrisclaydon
Date: 2010-04-15 16:04:19 -0400 (Thu, 15 Apr 2010)
New Revision: 2143

Modified:
   sandbox/adsk/2.2gp/lib/OpenLayers/OpenLayers.js
   trunk/lib/OpenLayers/OpenLayers.js
Log:
Re #333 - Bing: Map with Bing maps doesn't refresh when browser maximize

Redraw non-base layers when Bing base layer finishes resizing.

Modified: sandbox/adsk/2.2gp/lib/OpenLayers/OpenLayers.js
===================================================================
--- sandbox/adsk/2.2gp/lib/OpenLayers/OpenLayers.js	2010-04-15 16:26:04 UTC (rev 2142)
+++ sandbox/adsk/2.2gp/lib/OpenLayers/OpenLayers.js	2010-04-15 20:04:19 UTC (rev 2143)
@@ -23,23 +23,23 @@
  *
  *--------------------------------------------------------------------------*/
 
-/**  
-*  
+/**
+*
 *  Contains portions of Rico <http://openrico.org/>
-* 
-*  Copyright 2005 Sabre Airline Solutions  
-*  
+*
+*  Copyright 2005 Sabre Airline Solutions
+*
 *  Licensed under the Apache License, Version 2.0 (the "License"); you
 *  may not use this file except in compliance with the License. You
 *  may obtain a copy of the License at
-*  
-*         http://www.apache.org/licenses/LICENSE-2.0  
-*  
+*
+*         http://www.apache.org/licenses/LICENSE-2.0
+*
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 *  implied. See the License for the specific language governing
-*  permissions and limitations under the License. 
+*  permissions and limitations under the License.
 *
 **/
 
@@ -111,11 +111,11 @@
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
 
-/* 
+/*
  * @requires OpenLayers/BaseTypes.js
  * @requires OpenLayers/Lang/en.js
  * @requires OpenLayers/Console.js
- */ 
+ */
 
 (function() {
     /**
@@ -125,13 +125,13 @@
      * case with single file builds.
      */
     var singleFile = (typeof OpenLayers == "object" && OpenLayers.singleFile);
-    
+
     /**
      * Namespace: OpenLayers
      * The OpenLayers object provides a namespace for all things OpenLayers
      */
     window.OpenLayers = {
-        
+
         /**
          * Property: _scriptName
          * {String} Relative path of this script.
@@ -146,9 +146,9 @@
          * {String} Path to this script
          */
         _getScriptLocation: function () {
-            var scriptLocation = "";            
+            var scriptLocation = "";
             var isOL = new RegExp("(^|(.*?\\/))(" + OpenLayers._scriptName + ")(\\?|$)");
-         
+
             var scripts = document.getElementsByTagName('script');
             for (var i=0, len=scripts.length; i<len; i++) {
                 var src = scripts[i].getAttribute('src');
@@ -166,11 +166,11 @@
     /**
      * OpenLayers.singleFile is a flag indicating this file is being included
      * in a Single File Library build of the OpenLayers Library.
-     * 
+     *
      * When we are *not* part of a SFL build we dynamically include the
      * OpenLayers library code.
-     * 
-     * When we *are* part of a SFL build we do not dynamically include the 
+     *
+     * When we *are* part of a SFL build we do not dynamically include the
      * OpenLayers library code as it will be appended at the end of this file.
       */
     if(!singleFile) {
@@ -282,7 +282,7 @@
             "OpenLayers/Geometry/MultiPoint.js",
             "OpenLayers/Geometry/Curve.js",
             "OpenLayers/Geometry/LineString.js",
-            "OpenLayers/Geometry/LinearRing.js",        
+            "OpenLayers/Geometry/LinearRing.js",
             "OpenLayers/Geometry/Polygon.js",
             "OpenLayers/Geometry/MultiLineString.js",
             "OpenLayers/Geometry/MultiPolygon.js",
@@ -382,16 +382,16 @@
         if(docWrite) {
             var allScriptTags = new Array(jsfiles.length);
         }
-        var host = OpenLayers._getScriptLocation() + "lib/";    
+        var host = OpenLayers._getScriptLocation() + "lib/";
         for (var i=0, len=jsfiles.length; i<len; i++) {
             if (docWrite) {
                 allScriptTags[i] = "<script src='" + host + jsfiles[i] +
-                                   "'></script>"; 
+                                   "'></script>";
             } else {
                 var s = document.createElement("script");
                 s.src = host + jsfiles[i];
-                var h = document.getElementsByTagName("head").length ? 
-                           document.getElementsByTagName("head")[0] : 
+                var h = document.getElementsByTagName("head").length ?
+                           document.getElementsByTagName("head")[0] :
                            document.body;
                 h.appendChild(s);
             }
@@ -423,7 +423,7 @@
  */
 OpenLayers.Util = {};
 
-/** 
+/**
  * Function: getElement
  * This is the old $() from prototype
  */
@@ -443,7 +443,7 @@
     return elements;
 };
 
-/** 
+/**
  * Maintain existing definition of $.
  */
 if(typeof window.$  === "undefined") {
@@ -497,7 +497,7 @@
 };
 
 
-/** 
+/**
  * Function: removeItem
  * Remove an object from an array. Iterates through the array
  *     to find the item, then removes it.
@@ -505,7 +505,7 @@
  * Parameters:
  * array - {Array}
  * item - {Object}
- * 
+ *
  * Return
  * {Array} A reference to the array
  */
@@ -523,7 +523,7 @@
  * Function: clearArray
  * *Deprecated*. This function will disappear in 3.0.
  * Please use "array.length = 0" instead.
- * 
+ *
  * Parameters:
  * array - {Array}
  */
@@ -536,14 +536,14 @@
     array.length = 0;
 };
 
-/** 
+/**
  * Function: indexOf
  * Seems to exist already in FF, but not in MOZ.
- * 
+ *
  * Parameters:
  * array - {Array}
  * obj - {Object}
- * 
+ *
  * Returns:
  * {Integer} The index at, which the object was found in the array.
  *           If not found, returns -1.
@@ -555,29 +555,29 @@
             return i;
         }
     }
-    return -1;   
+    return -1;
 };
 
 
 
 /**
  * Function: modifyDOMElement
- * 
- * Modifies many properties of a DOM element all at once.  Passing in 
+ *
+ * Modifies many properties of a DOM element all at once.  Passing in
  * null to an individual parameter will avoid setting the attribute.
  *
  * Parameters:
  * id - {String} The element id attribute to set.
  * px - {<OpenLayers.Pixel>} The left and top style position.
  * sz - {<OpenLayers.Size>}  The width and height style attributes.
- * position - {String}       The position attribute.  eg: absolute, 
+ * position - {String}       The position attribute.  eg: absolute,
  *                           relative, etc.
  * border - {String}         The style.border attribute.  eg:
  *                           solid black 2px
- * overflow - {String}       The style.overview attribute.  
+ * overflow - {String}       The style.overview attribute.
  * opacity - {Float}         Fractional value (0.0 - 1.0)
  */
-OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, 
+OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position,
                                             border, overflow, opacity) {
 
     if (id) {
@@ -609,32 +609,32 @@
     }
 };
 
-/** 
+/**
  * Function: createDiv
  * Creates a new div and optionally set some standard attributes.
  * Null may be passed to each parameter if you do not wish to
  * set a particular attribute.
  * Note - zIndex is NOT set on the resulting div.
- * 
+ *
  * Parameters:
  * id - {String} An identifier for this element.  If no id is
- *               passed an identifier will be created 
+ *               passed an identifier will be created
  *               automatically.
- * px - {<OpenLayers.Pixel>} The element left and top position. 
+ * px - {<OpenLayers.Pixel>} The element left and top position.
  * sz - {<OpenLayers.Size>} The element width and height.
- * imgURL - {String} A url pointing to an image to use as a 
+ * imgURL - {String} A url pointing to an image to use as a
  *                   background image.
  * position - {String} The style.position value. eg: absolute,
  *                     relative etc.
- * border - {String} The the style.border value. 
+ * border - {String} The the style.border value.
  *                   eg: 2px solid black
  * overflow - {String} The style.overflow value. Eg. hidden
  * opacity - {Float} Fractional value (0.0 - 1.0)
- * 
- * Returns: 
+ *
+ * Returns:
  * {DOMElement} A DOM Div created with the specified attributes.
  */
-OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, 
+OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position,
                                      border, overflow, opacity) {
 
     var dom = document.createElement('div');
@@ -650,7 +650,7 @@
     if (!position) {
         position = "absolute";
     }
-    OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position, 
+    OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position,
                                      border, overflow, opacity);
 
     return dom;
@@ -659,7 +659,7 @@
 /**
  * Function: createImage
  * Creates an img element with specific attribute values.
- *  
+ *
  * Parameters:
  * id - {String} The id field for the img.  If none assigned one will be
  *               automatically generated.
@@ -671,7 +671,7 @@
  * opacity - {Float} Fractional value (0.0 - 1.0)
  * delayDisplay - {Boolean} If true waits until the image has been
  *                          loaded.
- * 
+ *
  * Returns:
  * {DOMElement} A DOM Image created with the specified attributes.
  */
@@ -687,18 +687,18 @@
     if (!position) {
         position = "relative";
     }
-    OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, 
+    OpenLayers.Util.modifyDOMElement(image, id, px, sz, position,
                                      border, null, opacity);
 
     if(delayDisplay) {
         image.style.display = "none";
-        OpenLayers.Event.observe(image, "load", 
+        OpenLayers.Event.observe(image, "load",
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoad, image));
-        OpenLayers.Event.observe(image, "error", 
+        OpenLayers.Event.observe(image, "error",
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, image));
-        
+
     }
-    
+
     //set special properties
     image.style.alt = id;
     image.galleryImg = "no";
@@ -707,17 +707,17 @@
     }
 
 
-        
+
     return image;
 };
 
 /**
  * Function: setOpacity
- * *Deprecated*.  This function has been deprecated. Instead, please use 
- *     <OpenLayers.Util.modifyDOMElement> 
- *     or 
+ * *Deprecated*.  This function has been deprecated. Instead, please use
+ *     <OpenLayers.Util.modifyDOMElement>
+ *     or
  *     <OpenLayers.Util.modifyAlphaImageDiv>
- * 
+ *
  * Set the opacity of a DOM Element
  *     Note that for this function to work in IE, elements must "have layout"
  *     according to:
@@ -739,23 +739,23 @@
  */
 OpenLayers.Util.onImageLoad = function() {
     // The complex check here is to solve issues described in #480.
-    // Every time a map view changes, it increments the 'viewRequestID' 
+    // Every time a map view changes, it increments the 'viewRequestID'
     // property. As the requests for the images for the new map view are sent
-    // out, they are tagged with this unique viewRequestID. 
-    // 
-    // If an image has no viewRequestID property set, we display it regardless, 
-    // but if it does have a viewRequestID property, we check that it matches 
+    // out, they are tagged with this unique viewRequestID.
+    //
+    // If an image has no viewRequestID property set, we display it regardless,
+    // but if it does have a viewRequestID property, we check that it matches
     // the viewRequestID set on the map.
-    // 
+    //
     // If the viewRequestID on the map has changed, that means that the user
     // has changed the map view since this specific request was sent out, and
     // therefore this tile does not need to be displayed (so we do not execute
     // this code that turns its display on).
     //
     if (!this.viewRequestID ||
-        (this.map && this.viewRequestID == this.map.viewRequestID)) { 
+        (this.map && this.viewRequestID == this.map.viewRequestID)) {
         this.style.backgroundColor ="transparent";
-        this.style.display = "";  
+        this.style.display = "";
     }
 };
 
@@ -774,7 +774,7 @@
 OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0;
 
 /**
- * Function: onImageLoadError 
+ * Function: onImageLoadError
  */
 OpenLayers.Util.onImageLoadError = function() {
     this._attempts = (this._attempts) ? (this._attempts + 1) : 1;
@@ -816,7 +816,7 @@
  * Checks whether it's necessary (and possible) to use the png alpha
  * hack which allows alpha transparency for png images under Internet
  * Explorer.
- * 
+ *
  * Returns:
  * {Boolean} true if the png alpha hack is necessary and possible, false otherwise.
  */
@@ -825,25 +825,25 @@
         var arVersion = navigator.appVersion.split("MSIE");
         var version = parseFloat(arVersion[1]);
         var filter = false;
-    
-        // IEs4Lin dies when trying to access document.body.filters, because 
+
+        // IEs4Lin dies when trying to access document.body.filters, because
         // the property is there, but requires a DLL that can't be provided. This
         // means that we need to wrap this in a try/catch so that this can
         // continue.
-    
-        try { 
+
+        try {
             filter = !!(document.body.filters);
-        } catch (e) {}    
-    
-        OpenLayers.Util.alphaHackNeeded = (filter && 
+        } catch (e) {}
+
+        OpenLayers.Util.alphaHackNeeded = (filter &&
                                            (version >= 5.5) && (version < 7));
     }
     return OpenLayers.Util.alphaHackNeeded;
 };
 
-/** 
+/**
  * Function: modifyAlphaImageDiv
- * 
+ *
  * div - {DOMElement} Div containing Alpha-adjusted Image
  * id - {String}
  * px - {<OpenLayers.Pixel>}
@@ -853,9 +853,9 @@
  * border - {String}
  * sizing {String} 'crop', 'scale', or 'image'. Default is "scale"
  * opacity - {Float} Fractional value (0.0 - 1.0)
- */ 
-OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL, 
-                                               position, border, sizing, 
+ */
+OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL,
+                                               position, border, sizing,
                                                opacity) {
 
     OpenLayers.Util.modifyDOMElement(div, id, px, sz, position,
@@ -866,9 +866,9 @@
     if (imgURL) {
         img.src = imgURL;
     }
-    OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz, 
+    OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz,
                                      "relative", border);
-    
+
     if (OpenLayers.Util.alphaHack()) {
         if(div.style.display != "none") {
             div.style.display = "inline-block";
@@ -876,11 +876,11 @@
         if (sizing == null) {
             sizing = "scale";
         }
-        
+
         div.style.filter = "progid:DXImageTransform.Microsoft" +
                            ".AlphaImageLoader(src='" + img.src + "', " +
                            "sizingMethod='" + sizing + "')";
-        if (parseFloat(div.style.opacity) >= 0.0 && 
+        if (parseFloat(div.style.opacity) >= 0.0 &&
             parseFloat(div.style.opacity) < 1.0) {
             div.style.filter += " alpha(opacity=" + div.style.opacity * 100 + ")";
         }
@@ -889,9 +889,9 @@
     }
 };
 
-/** 
+/**
  * Function: createAlphaImageDiv
- * 
+ *
  * id - {String}
  * px - {<OpenLayers.Pixel>}
  * sz - {<OpenLayers.Size>}
@@ -902,17 +902,17 @@
  * opacity - {Float} Fractional value (0.0 - 1.0)
  * delayDisplay - {Boolean} If true waits until the image has been
  *                          loaded.
- * 
+ *
  * Returns:
- * {DOMElement} A DOM Div created with a DOM Image inside it. If the hack is 
+ * {DOMElement} A DOM Div created with a DOM Image inside it. If the hack is
  *              needed for transparency in IE, it is added.
- */ 
-OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL, 
-                                               position, border, sizing, 
+ */
+OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL,
+                                               position, border, sizing,
                                                opacity, delayDisplay) {
-    
+
     var div = OpenLayers.Util.createDiv();
-    var img = OpenLayers.Util.createImage(null, null, null, null, null, null, 
+    var img = OpenLayers.Util.createImage(null, null, null, null, null, null,
                                           null, false);
     div.appendChild(img);
 
@@ -924,23 +924,23 @@
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, div));
     }
 
-    OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, position, 
+    OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, position,
                                         border, sizing, opacity);
-    
+
     return div;
 };
 
 
-/** 
+/**
  * Function: upperCaseObject
- * Creates a new hashtable and copies over all the keys from the 
+ * Creates a new hashtable and copies over all the keys from the
  *     passed-in object, but storing them under an uppercased
  *     version of the key at which they were stored.
- * 
- * Parameters: 
+ *
+ * Parameters:
  * object - {Object}
- * 
- * Returns: 
+ *
+ * Returns:
  * {Object} A new Object with all the same keys but uppercased
  */
 OpenLayers.Util.upperCaseObject = function (object) {
@@ -951,12 +951,12 @@
     return uObject;
 };
 
-/** 
+/**
  * Function: applyDefaults
  * Takes an object and copies any properties that don't exist from
  *     another properties, by analogy with OpenLayers.Util.extend() from
  *     Prototype.js.
- * 
+ *
  * Parameters:
  * to - {Object} The destination object.
  * from - {Object} The source object.  Any properties of this object that
@@ -992,27 +992,27 @@
        && from.hasOwnProperty('toString') && !to.hasOwnProperty('toString')) {
         to.toString = from.toString;
     }
-    
+
     return to;
 };
 
 /**
  * Function: getParameterString
- * 
+ *
  * Parameters:
  * params - {Object}
- * 
+ *
  * Returns:
- * {String} A concatenation of the properties of an object in 
- *          http parameter notation. 
+ * {String} A concatenation of the properties of an object in
+ *          http parameter notation.
  *          (ex. <i>"key1=value1&key2=value2&key3=value3"</i>)
  *          If a parameter is actually a list, that parameter will then
  *          be set to a comma-seperated list of values (foo,bar) instead
- *          of being URL escaped (foo%3Abar). 
+ *          of being URL escaped (foo%3Abar).
  */
 OpenLayers.Util.getParameterString = function(params) {
     var paramsArray = [];
-    
+
     for (var key in params) {
       var value = params[key];
       if ((value != null) && (typeof value != 'function')) {
@@ -1032,7 +1032,7 @@
         paramsArray.push(encodeURIComponent(key) + "=" + encodedValue);
       }
     }
-    
+
     return paramsArray.join("&");
 };
 
@@ -1042,9 +1042,9 @@
  */
 OpenLayers.ImgPath = '';
 
-/** 
+/**
  * Function: getImagesLocation
- * 
+ *
  * Returns:
  * {String} The fully formatted image location string
  */
@@ -1053,18 +1053,18 @@
 };
 
 
-/** 
+/**
  * Function: Try
- * Execute functions until one of them doesn't throw an error. 
+ * Execute functions until one of them doesn't throw an error.
  *     Capitalized because "try" is a reserved word in JavaScript.
  *     Taken directly from OpenLayers.Util.Try()
- * 
+ *
  * Parameters:
  * [*] - {Function} Any number of parameters may be passed to Try()
- *    It will attempt to execute each of them until one of them 
- *    successfully executes. 
+ *    It will attempt to execute each of them until one of them
+ *    successfully executes.
  *    If none executes successfully, returns null.
- * 
+ *
  * Returns:
  * {*} The value returned by the first successfully executed function.
  */
@@ -1083,15 +1083,15 @@
 };
 
 
-/** 
+/**
  * Function: getNodes
- * 
+ *
  * These could/should be made namespace aware?
- * 
+ *
  * Parameters:
  * p - {}
  * tagName - {String}
- * 
+ *
  * Returns:
  * {Array}
  */
@@ -1110,11 +1110,11 @@
 
 /**
  * Function: _getNodes
- * 
+ *
  * Parameters:
  * nodes - {Array}
  * tagName - {String}
- * 
+ *
  * Returns:
  * {Array}
  */
@@ -1133,12 +1133,12 @@
 
 /**
  * Function: getTagText
- * 
+ *
  * Parameters:
  * parent - {}
  * item - {String}
  * index - {Integer}
- * 
+ *
  * Returns:
  * {String}
  */
@@ -1150,28 +1150,28 @@
             index=0;
         }
         if (result[index].childNodes.length > 1) {
-            return result.childNodes[1].nodeValue; 
+            return result.childNodes[1].nodeValue;
         }
         else if (result[index].childNodes.length == 1) {
-            return result[index].firstChild.nodeValue; 
+            return result[index].firstChild.nodeValue;
         }
-    } else { 
-        return ""; 
+    } else {
+        return "";
     }
 };
 
 /**
  * Function: getXmlNodeValue
- * 
+ *
  * Parameters:
  * node - {XMLNode}
- * 
+ *
  * Returns:
  * {String} The text value of the given node, without breaking in firefox or IE
  */
 OpenLayers.Util.getXmlNodeValue = function(node) {
     var val = null;
-    OpenLayers.Util.Try( 
+    OpenLayers.Util.Try(
         function() {
             val = node.text;
             if (!val) {
@@ -1180,20 +1180,20 @@
             if (!val) {
                 val = node.firstChild.nodeValue;
             }
-        }, 
+        },
         function() {
             val = node.textContent;
-        }); 
+        });
     return val;
 };
 
-/** 
+/**
  * Function: mouseLeft
- * 
+ *
  * Parameters:
  * evt - {Event}
  * div - {HTMLDivElement}
- * 
+ *
  * Returns:
  * {Boolean}
  */
@@ -1255,10 +1255,10 @@
 
 /**
  * Function: rad
- * 
+ *
  * Parameters:
  * x - {Float}
- * 
+ *
  * Returns:
  * {Float}
  */
@@ -1269,11 +1269,11 @@
  * Given two objects representing points with geographic coordinates, this
  *     calculates the distance between those points on the surface of an
  *     ellipsoid.
- * 
+ *
  * Parameters:
  * p1 - {<OpenLayers.LonLat>} (or any object with both .lat, .lon properties)
  * p2 - {<OpenLayers.LonLat>} (or any object with both .lat, .lon properties)
- * 
+ *
  * Returns:
  * {Float} The distance (in km) between the two input points as measured on an
  *     ellipsoid.  Note that the input point objects must be in geographic
@@ -1320,14 +1320,14 @@
 
 /**
  * Function: getParameters
- * Parse the parameters from a URL or from the current page itself into a 
+ * Parse the parameters from a URL or from the current page itself into a
  *     JavaScript Object. Note that parameter values with commas are separated
  *     out into an Array.
- * 
+ *
  * Parameters:
  * url - {String} Optional url used to extract the query string.
  *                If null, query string is taken from page location.
- * 
+ *
  * Returns:
  * {Object} An object of key/value pairs from the query string.
  */
@@ -1343,7 +1343,7 @@
                     url.indexOf('#') : url.length;
         paramsString = url.substring(start, end);
     }
-        
+
     var parameters = {};
     var pairs = paramsString.split(/[&;]/);
     for(var i=0, len=pairs.length; i<len; ++i) {
@@ -1358,11 +1358,11 @@
                 value[j] = decodeURIComponent(value[j]);
             }
 
-            //if there's only one value, do not return as array                    
+            //if there's only one value, do not return as array
             if (value.length == 1) {
                 value = value[0];
-            }                
-            
+            }
+
             parameters[key] = value;
          }
      }
@@ -1373,11 +1373,11 @@
  * Function: getArgs
  * *Deprecated*.  Will be removed in 3.0.  Please use instead
  *     <OpenLayers.Util.getParameters>
- * 
+ *
  * Parameters:
  * url - {String} Optional url used to extract the query string.
  *                If null, query string is taken from page location.
- * 
+ *
  * Returns:
  * {Object} An object of key/value pairs from the query string.
  */
@@ -1402,10 +1402,10 @@
  * Create a unique identifier for this session.  Each time this function
  *     is called, a counter is incremented.  The return will be the optional
  *     prefix (defaults to "id_") appended with the counter value.
- * 
+ *
  * Parameters:
  * prefix {String} Optionsal string to prefix unique id. Default is "id_".
- * 
+ *
  * Returns:
  * {String} A unique id string, built on the passed in prefix.
  */
@@ -1413,8 +1413,8 @@
     if (prefix == null) {
         prefix = "id_";
     }
-    OpenLayers.Util.lastSeqID += 1; 
-    return prefix + OpenLayers.Util.lastSeqID;        
+    OpenLayers.Util.lastSeqID += 1;
+    return prefix + OpenLayers.Util.lastSeqID;
 };
 
 /**
@@ -1426,7 +1426,7 @@
  * The hardcoded table is maintain in a CS-MAP source code module named CSdataU.c
  * The hardcoded table of PROJ.4 units are in pj_units.c.
  */
-OpenLayers.INCHES_PER_UNIT = { 
+OpenLayers.INCHES_PER_UNIT = {
     'inches': 1.0,
     'ft': 12.0,
     'mi': 63360.0,
@@ -1512,8 +1512,8 @@
     "ch": OpenLayers.INCHES_PER_UNIT["IntnlChain"],  //International Chain
     "link": OpenLayers.INCHES_PER_UNIT["IntnlLink"], //International Link
     "us-in": OpenLayers.INCHES_PER_UNIT["inches"], //U.S. Surveyor's Inch
-    "us-ft": OpenLayers.INCHES_PER_UNIT["Foot"],	//U.S. Surveyor's Foot
-    "us-yd": OpenLayers.INCHES_PER_UNIT["Yard"],	//U.S. Surveyor's Yard
+    "us-ft": OpenLayers.INCHES_PER_UNIT["Foot"],    //U.S. Surveyor's Foot
+    "us-yd": OpenLayers.INCHES_PER_UNIT["Yard"],    //U.S. Surveyor's Yard
     "us-ch": OpenLayers.INCHES_PER_UNIT["GunterChain"], //U.S. Surveyor's Chain
     "us-mi": OpenLayers.INCHES_PER_UNIT["Mile"],   //U.S. Surveyor's Statute Mile
     "ind-yd": OpenLayers.INCHES_PER_UNIT["IndianYd37"],  //Indian Yard
@@ -1521,7 +1521,7 @@
     "ind-ch": 20.11669506 / OpenLayers.METERS_PER_INCH  //Indian Chain
 });
 
-/** 
+/**
  * Constant: DOTS_PER_INCH
  * {Integer} 72 (A sensible default)
  */
@@ -1529,32 +1529,32 @@
 
 /**
  * Function: normalizeScale
- * 
+ *
  * Parameters:
  * scale - {float}
- * 
+ *
  * Returns:
- * {Float} A normalized scale value, in 1 / X format. 
+ * {Float} A normalized scale value, in 1 / X format.
  *         This means that if a value less than one ( already 1/x) is passed
- *         in, it just returns scale directly. Otherwise, it returns 
+ *         in, it just returns scale directly. Otherwise, it returns
  *         1 / scale
  */
 OpenLayers.Util.normalizeScale = function (scale) {
-    var normScale = (scale > 1.0) ? (1.0 / scale) 
+    var normScale = (scale > 1.0) ? (1.0 / scale)
                                   : scale;
     return normScale;
 };
 
 /**
  * Function: getResolutionFromScale
- * 
+ *
  * Parameters:
  * scale - {Float}
  * units - {String} Index into OpenLayers.INCHES_PER_UNIT hashtable.
  *                  Default is degrees
- * 
+ *
  * Returns:
- * {Float} The corresponding resolution given passed-in scale and unit 
+ * {Float} The corresponding resolution given passed-in scale and unit
  *         parameters.
  */
 OpenLayers.Util.getResolutionFromScale = function (scale, units) {
@@ -1572,14 +1572,14 @@
 
 /**
  * Function: getScaleFromResolution
- * 
+ *
  * Parameters:
  * resolution - {Float}
  * units - {String} Index into OpenLayers.INCHES_PER_UNIT hashtable.
  *                  Default is degrees
- * 
+ *
  * Returns:
- * {Float} The corresponding scale given passed-in resolution and unit 
+ * {Float} The corresponding scale given passed-in resolution and unit
  *         parameters.
  */
 OpenLayers.Util.getScaleFromResolution = function (resolution, units) {
@@ -1595,13 +1595,13 @@
 
 /**
  * Function: safeStopPropagation
- * *Deprecated*. This function has been deprecated. Please use directly 
- *     <OpenLayers.Event.stop> passing 'true' as the 2nd 
+ * *Deprecated*. This function has been deprecated. Please use directly
+ *     <OpenLayers.Event.stop> passing 'true' as the 2nd
  *     argument (preventDefault)
- * 
+ *
  * Safely stop the propagation of an event *without* preventing
  *   the default browser action from occurring.
- * 
+ *
  * Parameter:
  * evt - {Event}
  */
@@ -1611,11 +1611,11 @@
 
 /**
  * Function: pagePositon
- * Calculates the position of an element on the page. 
+ * Calculates the position of an element on the page.
  *
  * Parameters:
  * forElement - {DOMElement}
- * 
+ *
  * Returns:
  * {Array} two item array, L value then T value.
  */
@@ -1631,7 +1631,7 @@
                 break;
             }
         }
-        
+
         valueT += element.offsetTop  || 0;
         valueL += element.offsetLeft || 0;
 
@@ -1652,25 +1652,25 @@
         valueL -= element.scrollLeft || 0;
         element = element.parentNode;
     }
-    
+
     return [valueL, valueT];
 };
 
 
-/** 
+/**
  * Function: isEquivalentUrl
- * Test two URLs for equivalence. 
- * 
+ * Test two URLs for equivalence.
+ *
  * Setting 'ignoreCase' allows for case-independent comparison.
- * 
- * Comparison is based on: 
+ *
+ * Comparison is based on:
  *  - Protocol
  *  - Host (evaluated without the port)
  *  - Port (set 'ignorePort80' to ignore "80" values)
  *  - Hash ( set 'ignoreHash' to disable)
- *  - Pathname (for relative <-> absolute comparison) 
+ *  - Pathname (for relative <-> absolute comparison)
  *  - Arguments (so they can be out of order)
- *  
+ *
  * Parameters:
  * url1 - {String}
  * url2 - {String}
@@ -1714,22 +1714,22 @@
     for(var key in urlObj2.args) {
         return false;
     }
-    
+
     return true;
 };
 
 /**
  * Function: createUrlObject
- * 
+ *
  * Parameters:
  * url - {String}
  * options - {Object} A hash of options.  Can be one of:
  *            ignoreCase: lowercase url,
  *            ignorePort80: don't include explicit port if port is 80,
  *            ignoreHash: Don't include part of url after the hash (#).
- * 
+ *
  * Returns:
- * {Object} An object with separate url, a, port, host, and args parsed out 
+ * {Object} An object with separate url, a, port, host, and args parsed out
  *          and ready for comparison
  */
 OpenLayers.Util.createUrlObject = function(url, options) {
@@ -1750,21 +1750,21 @@
             url = fullUrl + parts.join("/") + "/" + url;
         }
     }
-  
+
     if (options.ignoreCase) {
-        url = url.toLowerCase(); 
+        url = url.toLowerCase();
     }
 
     var a = document.createElement('a');
     a.href = url;
-    
+
     var urlObject = {};
-    
+
     //host (without port)
     urlObject.host = a.host.split(":").shift();
 
     //protocol
-    urlObject.protocol = a.protocol;  
+    urlObject.protocol = a.protocol;
 
     //port (get uniform browser behavior with port 80 here)
     if(options.ignorePort80) {
@@ -1774,8 +1774,8 @@
     }
 
     //hash
-    urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash;  
-    
+    urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash;
+
     //args
     var queryString = a.search;
     if (!queryString) {
@@ -1786,30 +1786,30 @@
 
     //pathname (uniform browser behavior with leading "/")
     urlObject.pathname = (a.pathname.charAt(0) == "/") ? a.pathname : "/" + a.pathname;
-    
-    return urlObject; 
+
+    return urlObject;
 };
- 
+
 /**
  * Function: removeTail
  * Takes a url and removes everything after the ? and #
- * 
+ *
  * Parameters:
  * url - {String} The url to process
- * 
+ *
  * Returns:
  * {String} The string with all queryString and Hash removed
  */
 OpenLayers.Util.removeTail = function(url) {
     var head = null;
-    
+
     var qMark = url.indexOf("?");
     var hashMark = url.indexOf("#");
 
     if (qMark == -1) {
         head = (hashMark != -1) ? url.substr(0,hashMark) : url;
     } else {
-        head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark)) 
+        head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark))
                                   : url.substr(0, qMark);
     }
     return head;
@@ -1818,24 +1818,24 @@
 
 /**
  * Function: getBrowserName
- * 
+ *
  * Returns:
- * {String} A string which specifies which is the current 
- *          browser in which we are running. 
- * 
+ * {String} A string which specifies which is the current
+ *          browser in which we are running.
+ *
  *          Currently-supported browser detection and codes:
  *           * 'opera' -- Opera
  *           * 'msie'  -- Internet Explorer
  *           * 'safari' -- Safari
  *           * 'firefox' -- FireFox
  *           * 'mozilla' -- Mozilla
- * 
- *          If we are unable to property identify the browser, we 
+ *
+ *          If we are unable to property identify the browser, we
  *           return an empty string.
  */
 OpenLayers.Util.getBrowserName = function() {
     var browserName = "";
-    
+
     var ua = navigator.userAgent.toLowerCase();
     if ( ua.indexOf( "opera" ) != -1 ) {
         browserName = "opera";
@@ -1850,46 +1850,46 @@
             browserName = "mozilla";
         }
     }
-    
+
     return browserName;
 };
 
 
 
-    
+
 /**
  * Method: getRenderedDimensions
  * Renders the contentHTML offscreen to determine actual dimensions for
  *     popup sizing. As we need layout to determine dimensions the content
- *     is rendered -9999px to the left and absolute to ensure the 
+ *     is rendered -9999px to the left and absolute to ensure the
  *     scrollbars do not flicker
- *     
+ *
  * Parameters:
  * contentHTML
- * size - {<OpenLayers.Size>} If either the 'w' or 'h' properties is 
- *     specified, we fix that dimension of the div to be measured. This is 
- *     useful in the case where we have a limit in one dimension and must 
+ * size - {<OpenLayers.Size>} If either the 'w' or 'h' properties is
+ *     specified, we fix that dimension of the div to be measured. This is
+ *     useful in the case where we have a limit in one dimension and must
  *     therefore meaure the flow in the other dimension.
  * options - {Object}
  *     displayClass - {String} Optional parameter.  A CSS class name(s) string
  *         to provide the CSS context of the rendered content.
- *     containerElement - {DOMElement} Optional parameter. Insert the HTML to 
- *         this node instead of the body root when calculating dimensions. 
- * 
+ *     containerElement - {DOMElement} Optional parameter. Insert the HTML to
+ *         this node instead of the body root when calculating dimensions.
+ *
  * Returns:
  * {OpenLayers.Size}
  */
 OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) {
-    
+
     var w, h;
-    
+
     // create temp container div with restricted size
     var container = document.createElement("div");
     container.style.visibility = "hidden";
-        
-    var containerElement = (options && options.containerElement) 
-    	? options.containerElement : document.body;
 
+    var containerElement = (options && options.containerElement)
+        ? options.containerElement : document.body;
+
     //fix a dimension, if specified.
     if (size) {
         if (size.w) {
@@ -1905,11 +1905,11 @@
     if (options && options.displayClass) {
         container.className = options.displayClass;
     }
-    
+
     // create temp content div and assign content
     var content = document.createElement("div");
     content.innerHTML = contentHTML;
-    
+
     // we need overflow visible when calculating the size
     content.style.overflow = "visible";
     if (content.childNodes) {
@@ -1918,13 +1918,13 @@
             content.childNodes[i].style.overflow = "visible";
         }
     }
-    
-    // add content to restricted container 
+
+    // add content to restricted container
     container.appendChild(content);
-    
+
     // append container to body for rendering
     containerElement.appendChild(container);
-    
+
     // Opera and IE7 can't handle a node with position:aboslute if it inherits
     // position:absolute from a parent.
     var parentHasPositionAbsolute = false;
@@ -1943,14 +1943,14 @@
     if(!parentHasPositionAbsolute) {
         container.style.position = "absolute";
     }
-    
+
     // calculate scroll width of content and add corners and shadow width
     if (!w) {
         w = parseInt(content.scrollWidth);
-    
+
         // update container width to allow height to adjust
         container.style.width = w + "px";
-    }        
+    }
     // capture height and add shadow and corner image widths
     if (!h) {
         h = parseInt(content.scrollHeight);
@@ -1959,35 +1959,35 @@
     // remove elements
     container.removeChild(content);
     containerElement.removeChild(container);
-    
+
     return new OpenLayers.Size(w, h);
 };
 
 /**
  * APIFunction: getScrollbarWidth
  * This function has been modified by the OpenLayers from the original version,
- *     written by Matthew Eernisse and released under the Apache 2 
+ *     written by Matthew Eernisse and released under the Apache 2
  *     license here:
- * 
+ *
  *     http://www.fleegix.org/articles/2006/05/30/getting-the-scrollbar-width-in-pixels
- * 
- *     It has been modified simply to cache its value, since it is physically 
- *     impossible that this code could ever run in more than one browser at 
- *     once. 
- * 
+ *
+ *     It has been modified simply to cache its value, since it is physically
+ *     impossible that this code could ever run in more than one browser at
+ *     once.
+ *
  * Returns:
  * {Integer}
  */
 OpenLayers.Util.getScrollbarWidth = function() {
-    
+
     var scrollbarWidth = OpenLayers.Util._scrollbarWidth;
-    
+
     if (scrollbarWidth == null) {
         var scr = null;
         var inn = null;
         var wNoScroll = 0;
         var wScroll = 0;
-    
+
         // Outer scrolling div
         scr = document.createElement('div');
         scr.style.position = 'absolute';
@@ -1997,28 +1997,28 @@
         scr.style.height = '50px';
         // Start with no scrollbar
         scr.style.overflow = 'hidden';
-    
+
         // Inner content div
         inn = document.createElement('div');
         inn.style.width = '100%';
         inn.style.height = '200px';
-    
+
         // Put the inner div in the scrolling div
         scr.appendChild(inn);
         // Append the scrolling div to the doc
         document.body.appendChild(scr);
-    
+
         // Width of the inner div sans scrollbar
         wNoScroll = inn.offsetWidth;
-    
+
         // Add the scrollbar
         scr.style.overflow = 'scroll';
         // Width of the inner div width scrollbar
         wScroll = inn.offsetWidth;
-    
+
         // Remove the scrolling div from the doc
         document.body.removeChild(document.body.lastChild);
-    
+
         // Pixel width of the scroller
         OpenLayers.Util._scrollbarWidth = (wNoScroll - wScroll);
         scrollbarWidth = OpenLayers.Util._scrollbarWidth;
@@ -2046,7 +2046,7 @@
  * Note that behavior will differ with the Firebug extention and Firebug Lite.
  * Most notably, the Firebug Lite console does not currently allow for
  * hyperlinks to code or for clicking on object to explore their properties.
- * 
+ *
  */
 OpenLayers.Console = {
     /**
@@ -2055,7 +2055,7 @@
      * included.  We explicitly require the Firebug Lite script to trigger
      * functionality of the OpenLayers.Console methods.
      */
-    
+
     /**
      * APIFunction: log
      * Log an object in the console.  The Firebug Lite console logs string
@@ -2065,7 +2065,7 @@
      * will be used in string substitution.  Any additional arguments (beyond
      * the number substituted in a format string) will be appended in a space-
      * delimited line.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2077,7 +2077,7 @@
      * where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2089,7 +2089,7 @@
      * coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2101,7 +2101,7 @@
      * color coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2113,12 +2113,12 @@
      * coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
     error: function() {},
-    
+
     /**
      * APIFunction: userError
      * A single interface for showing error messages to the user. The default
@@ -2126,7 +2126,7 @@
      * reassigning OpenLayers.Console.userError to a different function.
      *
      * Expects a single error message
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2140,7 +2140,7 @@
      * the console and throw an exception.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2150,7 +2150,7 @@
      * APIFunction: dir
      * Prints an interactive listing of all properties of the object. This
      * looks identical to the view that you would see in the DOM tab.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2161,7 +2161,7 @@
      * Prints the XML source tree of an HTML or XML element. This looks
      * identical to the view that you would see in the HTML tab. You can click
      * on any node to inspect it in the HTML tab.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2174,7 +2174,7 @@
      * as well as the values that were passed as arguments to each function.
      * You can click each function to take you to its source in the Script tab,
      * and click each argument value to inspect it in the DOM or HTML tabs.
-     * 
+     *
      */
     trace: function() {},
 
@@ -2185,7 +2185,7 @@
      * to close the block.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2197,7 +2197,7 @@
      * OpenLayers.Console.group
      */
     groupEnd: function() {},
-    
+
     /**
      * APIFunction: time
      * Creates a new timer under the given name. Call
@@ -2225,7 +2225,7 @@
      * contain the text to be printed in the header of the profile report.
      *
      * This function is not currently implemented in Firebug Lite.
-     * 
+     *
      * Parameters:
      * title - {String} Optional title for the profiler
      */
@@ -2234,7 +2234,7 @@
     /**
      * APIFunction: profileEnd
      * Turns off the JavaScript profiler and prints its report.
-     * 
+     *
      * This function is not currently implemented in Firebug Lite.
      */
     profileEnd: function() {},
@@ -2293,8 +2293,8 @@
  * @requires OpenLayers/Lang/en.js
  * @requires OpenLayers/Console.js
  */
- 
-/** 
+
+/**
  * Header: OpenLayers Base Types
  * OpenLayers custom string, number and function functions are described here.
  */
@@ -2307,12 +2307,12 @@
 
     /**
      * APIFunction: startsWith
-     * Test whether a string starts with another string. 
-     * 
+     * Test whether a string starts with another string.
+     *
      * Parameters:
      * str - {String} The string to test.
      * sub - {Sring} The substring to look for.
-     *  
+     *
      * Returns:
      * {Boolean} The first string starts with the second.
      */
@@ -2323,43 +2323,43 @@
     /**
      * APIFunction: contains
      * Test whether a string contains another string.
-     * 
+     *
      * Parameters:
      * str - {String} The string to test.
      * sub - {String} The substring to look for.
-     * 
+     *
      * Returns:
      * {Boolean} The first string contains the second.
      */
     contains: function(str, sub) {
         return (str.indexOf(sub) != -1);
     },
-    
+
     /**
      * APIFunction: trim
      * Removes leading and trailing whitespace characters from a string.
-     * 
+     *
      * Parameters:
      * str - {String} The (potentially) space padded string.  This string is not
      *     modified.
-     * 
+     *
      * Returns:
-     * {String} A trimmed version of the string with all leading and 
+     * {String} A trimmed version of the string with all leading and
      *     trailing spaces removed.
      */
     trim: function(str) {
         return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
     },
-    
+
     /**
      * APIFunction: camelize
-     * Camel-case a hyphenated string. 
+     * Camel-case a hyphenated string.
      *     Ex. "chicken-head" becomes "chickenHead", and
      *     "-chicken-head" becomes "ChickenHead".
      *
      * Parameters:
      * str - {String} The string to be camelized.  The original is not modified.
-     * 
+     *
      * Returns:
      * {String} The string, camelized
      */
@@ -2372,7 +2372,7 @@
         }
         return camelizedString;
     },
-    
+
     /**
      * APIFunction: format
      * Given a string with tokens in the form ${token}, return a string
@@ -2399,7 +2399,7 @@
             context = window;
         }
 
-        // Example matching: 
+        // Example matching:
         // str   = ${foo.bar}
         // match = foo.bar
         var replacer = function(str, match) {
@@ -2425,13 +2425,13 @@
             }
 
             // If replacement is undefined, return the string 'undefined'.
-            // This is a workaround for a bugs in browsers not properly 
+            // This is a workaround for a bugs in browsers not properly
             // dealing with non-participating groups in regular expressions:
             // http://blog.stevenlevithan.com/archives/npcg-javascript
             if (typeof replacement == 'undefined') {
                 return 'undefined';
             } else {
-                return replacement; 
+                return replacement;
             }
         };
 
@@ -2444,13 +2444,13 @@
      * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
      */
     tokenRegEx:  /\$\{([\w.]+?)\}/g,
-    
+
     /**
      * Property: OpenLayers.String.numberRegEx
      * Used to test strings as numbers.
      */
     numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,
-    
+
     /**
      * APIFunction: OpenLayers.String.isNumeric
      * Determine whether a string contains only a numeric value.
@@ -2469,14 +2469,14 @@
     isNumeric: function(value) {
         return OpenLayers.String.numberRegEx.test(value);
     },
-    
+
     /**
      * APIFunction: numericIf
      * Converts a string that appears to be a numeric value into a number.
-     * 
+     *
      * Returns
      * {Number|String} a Number if the passed value is a number, a String
-     *     otherwise. 
+     *     otherwise.
      */
     numericIf: function(value) {
         return OpenLayers.String.isNumeric(value) ? parseFloat(value) : value;
@@ -2487,11 +2487,11 @@
 if (!String.prototype.startsWith) {
     /**
      * APIMethod: String.startsWith
-     * *Deprecated*. Whether or not a string starts with another string. 
-     * 
+     * *Deprecated*. Whether or not a string starts with another string.
+     *
      * Parameters:
      * sStart - {Sring} The string we're testing for.
-     *  
+     *
      * Returns:
      * {Boolean} Whether or not this string starts with the string passed in.
      */
@@ -2506,10 +2506,10 @@
     /**
      * APIMethod: String.contains
      * *Deprecated*. Whether or not a string contains another string.
-     * 
+     *
      * Parameters:
      * str - {String} The string that we're testing for.
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not this string contains with the string passed in.
      */
@@ -2524,9 +2524,9 @@
     /**
      * APIMethod: String.trim
      * *Deprecated*. Removes leading and trailing whitespace characters from a string.
-     * 
+     *
      * Returns:
-     * {String} A trimmed version of the string - all leading and 
+     * {String} A trimmed version of the string - all leading and
      *          trailing spaces removed
      */
     String.prototype.trim = function() {
@@ -2539,10 +2539,10 @@
 if (!String.prototype.camelize) {
     /**
      * APIMethod: String.camelize
-     * *Deprecated*. Camel-case a hyphenated string. 
+     * *Deprecated*. Camel-case a hyphenated string.
      *     Ex. "chicken-head" becomes "chickenHead", and
      *     "-chicken-head" becomes "ChickenHead".
-     * 
+     *
      * Returns:
      * {String} The string, camelized
      */
@@ -2564,21 +2564,21 @@
      * Decimal separator to use when formatting numbers.
      */
     decimalSeparator: ".",
-    
+
     /**
      * Property: thousandsSeparator
      * Thousands separator to use when formatting numbers.
      */
     thousandsSeparator: ",",
-    
+
     /**
      * APIFunction: limitSigDigs
      * Limit the number of significant digits on a float.
-     * 
+     *
      * Parameters:
      * num - {Float}
      * sig - {Integer}
-     * 
+     *
      * Returns:
      * {Float} The number, rounded to the specified number of significant
      *     digits.
@@ -2590,11 +2590,11 @@
         }
         return fig;
     },
-    
+
     /**
      * APIFunction: format
      * Formats a number for output.
-     * 
+     *
      * Parameters:
      * num  - {Float}
      * dec  - {Integer} Number of decimal places to round to.
@@ -2608,9 +2608,9 @@
      * {String} A string representing the formatted number.
      */
     format: function(num, dec, tsep, dsep) {
-        dec = (typeof dec != "undefined") ? dec : 0; 
+        dec = (typeof dec != "undefined") ? dec : 0;
         tsep = (typeof tsep != "undefined") ? tsep :
-            OpenLayers.Number.thousandsSeparator; 
+            OpenLayers.Number.thousandsSeparator;
         dsep = (typeof dsep != "undefined") ? dsep :
             OpenLayers.Number.decimalSeparator;
 
@@ -2623,15 +2623,15 @@
             // integer where we do not want to touch the decimals
             dec = 0;
         }
-        
+
         var integer = parts[0];
         if (tsep) {
-            var thousands = /(-?[0-9]+)([0-9]{3})/; 
-            while(thousands.test(integer)) { 
-                integer = integer.replace(thousands, "$1" + tsep + "$2"); 
+            var thousands = /(-?[0-9]+)([0-9]{3})/;
+            while(thousands.test(integer)) {
+                integer = integer.replace(thousands, "$1" + tsep + "$2");
             }
         }
-        
+
         var str;
         if (dec == 0) {
             str = integer;
@@ -2651,10 +2651,10 @@
      * APIMethod: Number.limitSigDigs
      * *Deprecated*. Limit the number of significant digits on an integer. Does *not*
      *     work with floats!
-     * 
+     *
      * Parameters:
      * sig - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} The number, rounded to the specified number of significant digits.
      *           If null, 0, or negative value passed in, returns 0
@@ -2675,11 +2675,11 @@
      * APIFunction: bind
      * Bind a function to an object.  Method to easily create closures with
      *     'this' altered.
-     * 
+     *
      * Parameters:
      * func - {Function} Input function.
      * object - {Object} The object to bind to the input function (as this).
-     * 
+     *
      * Returns:
      * {Function} A closure with 'this' set to the passed in object.
      */
@@ -2695,16 +2695,16 @@
             return func.apply(object, newArgs);
         };
     },
-    
+
     /**
      * APIFunction: bindAsEventListener
      * Bind a function to an object, and configure it to receive the event
-     *     object as first parameter when called. 
-     * 
+     *     object as first parameter when called.
+     *
      * Parameters:
      * func - {Function} Input function to serve as an event listener.
      * object - {Object} A reference to this.
-     * 
+     *
      * Returns:
      * {Function}
      */
@@ -2718,12 +2718,12 @@
 if (!Function.prototype.bind) {
     /**
      * APIMethod: Function.bind
-     * *Deprecated*. Bind a function to an object. 
+     * *Deprecated*. Bind a function to an object.
      * Method to easily create closures with 'this' altered.
-     * 
+     *
      * Parameters:
      * object - {Object} the this parameter
-     * 
+     *
      * Returns:
      * {Function} A closure with 'this' altered to the first
      *            argument.
@@ -2741,11 +2741,11 @@
     /**
      * APIMethod: Function.bindAsEventListener
      * *Deprecated*. Bind a function to an object, and configure it to receive the
-     *     event object as first parameter when called. 
-     * 
+     *     event object as first parameter when called.
+     *
      * Parameters:
      * object - {Object} A reference to this.
-     * 
+     *
      * Returns:
      * {Function}
      */
@@ -2802,11 +2802,11 @@
                         selected.push(val);
                     }
                 }
-            }        
+            }
         }
         return selected;
     }
-    
+
 };
 /* ======================================================================
     OpenLayers/BaseTypes/Class.js
@@ -2818,13 +2818,13 @@
 
 /**
  * Constructor: OpenLayers.Class
- * Base class used to construct all other classes. Includes support for 
- *     multiple inheritance. 
- *     
- * This constructor is new in OpenLayers 2.5.  At OpenLayers 3.0, the old 
- *     syntax for creating classes and dealing with inheritance 
+ * Base class used to construct all other classes. Includes support for
+ *     multiple inheritance.
+ *
+ * This constructor is new in OpenLayers 2.5.  At OpenLayers 3.0, the old
+ *     syntax for creating classes and dealing with inheritance
  *     will be removed.
- * 
+ *
  * To create a new OpenLayers-style class, use the following syntax:
  * > var MyClass = OpenLayers.Class(prototype);
  *
@@ -2945,7 +2945,7 @@
      * {Number} width
      */
     w: 0.0,
-    
+
     /**
      * APIProperty: h
      * {Number} height
@@ -2971,7 +2971,7 @@
      * Return the string representation of a size object
      *
      * Returns:
-     * {String} The string representation of OpenLayers.Size object. 
+     * {String} The string representation of OpenLayers.Size object.
      * (ex. <i>"w=55,h=66"</i>)
      */
     toString:function() {
@@ -2998,7 +2998,7 @@
      * Parameters:
      * sz - {<OpenLayers.Size>}
      *
-     * Returns: 
+     * Returns:
      * {Boolean} The passed in size has the same h and w properties as this one.
      * Note that if sz passed in is null, returns false.
      *
@@ -3031,7 +3031,7 @@
  * Instances of this class represent bounding boxes.  Data stored as left,
  * bottom, right, top floats. All values are initialized to null, however,
  * you should make sure you set them before using the bounds for anything.
- * 
+ *
  * Possible use case:
  * > bounds = new OpenLayers.Bounds();
  * > bounds.extend(new OpenLayers.LonLat(4,5));
@@ -3063,7 +3063,7 @@
      * {Number} Maximum vertical coordinate.
      */
     top: null,
-    
+
     /**
      * Property: centerLonLat
      * {<OpenLayers.LonLat>} A cached center location.  This should not be
@@ -3106,7 +3106,7 @@
      * {<OpenLayers.Bounds>} A fresh copy of the bounds
      */
     clone:function() {
-        return new OpenLayers.Bounds(this.left, this.bottom, 
+        return new OpenLayers.Bounds(this.left, this.bottom,
                                      this.right, this.top);
     },
 
@@ -3119,25 +3119,25 @@
      *
      * Returns:
      * {Boolean} The passed-in bounds object has the same left,
-     *           right, top, bottom components as this.  Note that if bounds 
+     *           right, top, bottom components as this.  Note that if bounds
      *           passed in is null, returns false.
      */
     equals:function(bounds) {
         var equals = false;
         if (bounds != null) {
-            equals = ((this.left == bounds.left) && 
+            equals = ((this.left == bounds.left) &&
                       (this.right == bounds.right) &&
-                      (this.top == bounds.top) && 
+                      (this.top == bounds.top) &&
                       (this.bottom == bounds.bottom));
         }
         return equals;
     },
 
-    /** 
+    /**
      * APIMethod: toString
-     * 
+     *
      * Returns:
-     * {String} String representation of bounds object. 
+     * {String} String representation of bounds object.
      *          (ex.<i>"left-bottom=(5,42) right-top=(10,45)"</i>)
      */
     toString:function() {
@@ -3153,32 +3153,32 @@
      */
     toArray: function() {
         return [this.left, this.bottom, this.right, this.top];
-    },    
+    },
 
-    /** 
+    /**
      * APIMethod: toBBOX
-     * 
+     *
      * Parameters:
      * decimal - {Integer} How many significant digits in the bbox coords?
      *                     Default is 6
-     * 
+     *
      * Returns:
      * {String} Simple String representation of bounds object.
      *          (ex. <i>"5,42,10,45"</i>)
      */
     toBBOX:function(decimal) {
         if (decimal== null) {
-            decimal = 6; 
+            decimal = 6;
         }
         var mult = Math.pow(10, decimal);
-        var bbox = Math.round(this.left * mult) / mult + "," + 
-                   Math.round(this.bottom * mult) / mult + "," + 
-                   Math.round(this.right * mult) / mult + "," + 
+        var bbox = Math.round(this.left * mult) / mult + "," +
+                   Math.round(this.bottom * mult) / mult + "," +
+                   Math.round(this.right * mult) / mult + "," +
                    Math.round(this.top * mult) / mult;
 
         return bbox;
     },
- 
+
     /**
      * APIMethod: toGeometry
      * Create a new polygon geometry based on this bounds.
@@ -3197,10 +3197,10 @@
             ])
         ]);
     },
-    
+
     /**
      * APIMethod: getWidth
-     * 
+     *
      * Returns:
      * {Float} The width of the bounds
      */
@@ -3210,7 +3210,7 @@
 
     /**
      * APIMethod: getHeight
-     * 
+     *
      * Returns:
      * {Float} The height of the bounds (top minus bottom).
      */
@@ -3220,7 +3220,7 @@
 
     /**
      * APIMethod: getSize
-     * 
+     *
      * Returns:
      * {<OpenLayers.Size>} The size of the box.
      */
@@ -3230,7 +3230,7 @@
 
     /**
      * APIMethod: getCenterPixel
-     * 
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The center of the bounds in pixel space.
      */
@@ -3241,7 +3241,7 @@
 
     /**
      * APIMethod: getCenterLonLat
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The center of the bounds in map space.
      */
@@ -3256,12 +3256,12 @@
 
     /**
      * Method: scale
-     * Scales the bounds around a pixel or lonlat. Note that the new 
+     * Scales the bounds around a pixel or lonlat. Note that the new
      *     bounds may return non-integer properties, even if a pixel
-     *     is passed. 
-     * 
+     *     is passed.
+     *
      * Parameters:
-     * ratio - {Float} 
+     * ratio - {Float}
      * origin - {<OpenLayers.Pixel> or <OpenLayers.LonLat>}
      *          Default is center.
      *
@@ -3276,7 +3276,7 @@
         }
 
         var bounds = [];
-        
+
         var origx,origy;
 
         // get origin coordinates
@@ -3292,17 +3292,17 @@
         var bottom = (this.bottom - origy) * ratio + origy;
         var right = (this.right - origx) * ratio + origx;
         var top = (this.top - origy) * ratio + origy;
-        
+
         return new OpenLayers.Bounds(left, bottom, right, top);
     },
 
     /**
      * APIMethod: add
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>} A new bounds whose coordinates are the same as
      *     this, but shifted by the passed-in x and y values.
@@ -3316,13 +3316,13 @@
         return new OpenLayers.Bounds(this.left + x, this.bottom + y,
                                      this.right + x, this.top + y);
     },
-    
+
     /**
      * APIMethod: extend
      * Extend the bounds to include the point, lonlat, or bounds specified.
      *     Note, this function assumes that left < right and bottom < top.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * object - {Object} Can be LonLat, Point, or Bounds
      */
     extend:function(object) {
@@ -3330,7 +3330,7 @@
         if (object) {
             // clear cached center location
             switch(object.CLASS_NAME) {
-                case "OpenLayers.LonLat":    
+                case "OpenLayers.LonLat":
                     bounds = new OpenLayers.Bounds(object.lon, object.lat,
                                                     object.lon, object.lat);
                     break;
@@ -3338,12 +3338,12 @@
                     bounds = new OpenLayers.Bounds(object.x, object.y,
                                                     object.x, object.y);
                     break;
-                    
-                case "OpenLayers.Bounds":    
+
+                case "OpenLayers.Bounds":
                     bounds = object;
                     break;
             }
-    
+
             if (bounds) {
                 this.centerLonLat = null;
                 if ( (this.left == null) || (bounds.left < this.left)) {
@@ -3351,11 +3351,11 @@
                 }
                 if ( (this.bottom == null) || (bounds.bottom < this.bottom) ) {
                     this.bottom = bounds.bottom;
-                } 
+                }
                 if ( (this.right == null) || (bounds.right > this.right) ) {
                     this.right = bounds.right;
                 }
-                if ( (this.top == null) || (bounds.top > this.top) ) { 
+                if ( (this.top == null) || (bounds.top > this.top) ) {
                     this.top = bounds.top;
                 }
             }
@@ -3364,7 +3364,7 @@
 
     /**
      * APIMethod: containsLonLat
-     * 
+     *
      * Parameters:
      * ll - {<OpenLayers.LonLat>}
      * inclusive - {Boolean} Whether or not to include the border.
@@ -3379,7 +3379,7 @@
 
     /**
      * APIMethod: containsPixel
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      * inclusive - {Boolean} Whether or not to include the border. Default is
@@ -3391,10 +3391,10 @@
     containsPixel:function(px, inclusive) {
         return this.contains(px.x, px.y, inclusive);
     },
-    
+
     /**
      * APIMethod: contains
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
@@ -3420,12 +3420,12 @@
 
         var contains = false;
         if (inclusive) {
-            contains = ((x >= this.left) && (x <= this.right) && 
+            contains = ((x >= this.left) && (x <= this.right) &&
                         (y >= this.bottom) && (y <= this.top));
         } else {
-            contains = ((x > this.left) && (x < this.right) && 
+            contains = ((x > this.left) && (x < this.right) &&
                         (y > this.bottom) && (y < this.top));
-        }              
+        }
         return contains;
     },
 
@@ -3434,7 +3434,7 @@
      * Determine whether the target bounds intersects this bounds.  Bounds are
      *     considered intersecting if any of their edges intersect or if one
      *     bounds contains the other.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>} The target bounds.
      * inclusive - {Boolean} Treat coincident borders as intersecting.  Default
@@ -3455,7 +3455,7 @@
             this.top == bounds.bottom ||
             this.bottom == bounds.top
         );
-        
+
         // if the two bounds only touch at an edge, and inclusive is false,
         // then the bounds don't *really* intersect.
         if (inclusive || !mightTouch) {
@@ -3481,11 +3481,11 @@
         }
         return intersects;
     },
-    
+
     /**
      * APIMethod: containsBounds
      * Determine whether the target bounds is contained within this bounds.
-     * 
+     *
      * bounds - {<OpenLayers.Bounds>} The target bounds.
      * partial - {Boolean} If any of the target corners is within this bounds
      *     consider the bounds contained.  Default is false.  If true, the
@@ -3494,7 +3494,7 @@
      *     true.
      *
      * Returns:
-     * {Boolean} The passed-in bounds object is contained within this bounds. 
+     * {Boolean} The passed-in bounds object is contained within this bounds.
      */
     containsBounds:function(bounds, partial, inclusive) {
         if (partial == null) {
@@ -3507,39 +3507,39 @@
         var bottomRight = this.contains(bounds.right, bounds.bottom, inclusive);
         var topLeft  = this.contains(bounds.left, bounds.top, inclusive);
         var topRight = this.contains(bounds.right, bounds.top, inclusive);
-        
+
         return (partial) ? (bottomLeft || bottomRight || topLeft || topRight)
                          : (bottomLeft && bottomRight && topLeft && topRight);
     },
 
-    /** 
+    /**
      * APIMethod: determineQuadrant
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
      * {String} The quadrant ("br" "tr" "tl" "bl") of the bounds in which the
      *     coordinate lies.
      */
     determineQuadrant: function(lonlat) {
-    
+
         var quadrant = "";
         var center = this.getCenterLonLat();
-        
+
         quadrant += (lonlat.lat < center.lat) ? "b" : "t";
         quadrant += (lonlat.lon < center.lon) ? "l" : "r";
-    
-        return quadrant; 
+
+        return quadrant;
     },
-    
+
     /**
      * APIMethod: transform
-     * Transform the Bounds object from source to dest. 
+     * Transform the Bounds object from source to dest.
      *
-     * Parameters: 
-     * source - {<OpenLayers.Projection>} Source projection. 
-     * dest   - {<OpenLayers.Projection>} Destination projection. 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} Source projection.
+     * dest   - {<OpenLayers.Projection>} Destination projection.
      *
      * Returns:
      * {<OpenLayers.Bounds>} Itself, for use in chaining operations.
@@ -3564,68 +3564,68 @@
 
     /**
      * APIMethod: wrapDateLine
-     *  
+     *
      * Parameters:
      * maxExtent - {<OpenLayers.Bounds>}
      * options - {Object} Some possible options are:
-     *                    leftTolerance - {float} Allow for a margin of error 
-     *                                            with the 'left' value of this 
+     *                    leftTolerance - {float} Allow for a margin of error
+     *                                            with the 'left' value of this
      *                                            bound.
      *                                            Default is 0.
-     *                    rightTolerance - {float} Allow for a margin of error 
-     *                                             with the 'right' value of 
+     *                    rightTolerance - {float} Allow for a margin of error
+     *                                             with the 'right' value of
      *                                             this bound.
      *                                             Default is 0.
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A copy of this bounds, but wrapped around the 
-     *                       "dateline" (as specified by the borders of 
-     *                       maxExtent). Note that this function only returns 
-     *                       a different bounds value if this bounds is 
-     *                       *entirely* outside of the maxExtent. If this 
-     *                       bounds straddles the dateline (is part in/part 
-     *                       out of maxExtent), the returned bounds will be 
+     * {<OpenLayers.Bounds>} A copy of this bounds, but wrapped around the
+     *                       "dateline" (as specified by the borders of
+     *                       maxExtent). Note that this function only returns
+     *                       a different bounds value if this bounds is
+     *                       *entirely* outside of the maxExtent. If this
+     *                       bounds straddles the dateline (is part in/part
+     *                       out of maxExtent), the returned bounds will be
      *                       merely a copy of this one.
      */
-    wrapDateLine: function(maxExtent, options) {    
+    wrapDateLine: function(maxExtent, options) {
         options = options || {};
-        
+
         var leftTolerance = options.leftTolerance || 0;
         var rightTolerance = options.rightTolerance || 0;
 
         var newBounds = this.clone();
-    
+
         if (maxExtent) {
 
            //shift right?
-           while ( newBounds.left < maxExtent.left && 
-                   (newBounds.right - rightTolerance) <= maxExtent.left ) { 
+           while ( newBounds.left < maxExtent.left &&
+                   (newBounds.right - rightTolerance) <= maxExtent.left ) {
                 newBounds = newBounds.add(maxExtent.getWidth(), 0);
            }
 
            //shift left?
-           while ( (newBounds.left + leftTolerance) >= maxExtent.right && 
-                   newBounds.right > maxExtent.right ) { 
+           while ( (newBounds.left + leftTolerance) >= maxExtent.right &&
+                   newBounds.right > maxExtent.right ) {
                 newBounds = newBounds.add(-maxExtent.getWidth(), 0);
            }
         }
-                
+
         return newBounds;
     },
 
     CLASS_NAME: "OpenLayers.Bounds"
 });
 
-/** 
+/**
  * APIFunction: fromString
- * Alternative constructor that builds a new OpenLayers.Bounds from a 
+ * Alternative constructor that builds a new OpenLayers.Bounds from a
  *     parameter string
- * 
- * Parameters: 
+ *
+ * Parameters:
  * str - {String}Comma-separated bounds string. (ex. <i>"5,42,10,45"</i>)
- * 
+ *
  * Returns:
- * {<OpenLayers.Bounds>} New bounds object built from the 
+ * {<OpenLayers.Bounds>} New bounds object built from the
  *                       passed-in String.
  */
 OpenLayers.Bounds.fromString = function(str) {
@@ -3633,11 +3633,11 @@
     return OpenLayers.Bounds.fromArray(bounds);
 };
 
-/** 
+/**
  * APIFunction: fromArray
  * Alternative constructor that builds a new OpenLayers.Bounds
  *     from an array
- * 
+ *
  * Parameters:
  * bbox - {Array(Float)} Array of bounds values (ex. <i>[5,42,10,45]</i>)
  *
@@ -3651,13 +3651,13 @@
                                  parseFloat(bbox[3]));
 };
 
-/** 
+/**
  * APIFunction: fromSize
  * Alternative constructor that builds a new OpenLayers.Bounds
  *     from a size
- * 
+ *
  * Parameters:
- * size - {<OpenLayers.Size>} 
+ * size - {<OpenLayers.Size>}
  *
  * Returns:
  * {<OpenLayers.Bounds>} New bounds object built from the passed-in size.
@@ -3677,16 +3677,16 @@
  * quadrant - {String} two character quadrant shortstring
  *
  * Returns:
- * {String} The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if 
- *          you pass in "bl" it returns "tr", if you pass in "br" it 
+ * {String} The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if
+ *          you pass in "bl" it returns "tr", if you pass in "br" it
  *          returns "tl", etc.
  */
 OpenLayers.Bounds.oppositeQuadrant = function(quadrant) {
     var opp = "";
-    
+
     opp += (quadrant.charAt(0) == 't') ? 'b' : 't';
     opp += (quadrant.charAt(1) == 'l') ? 'r' : 'l';
-    
+
     return opp;
 };
 /* ======================================================================
@@ -3704,10 +3704,10 @@
 
     /**
      * APIFunction: visible
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
      * {Boolean} Is the element visible?
      */
@@ -3718,14 +3718,14 @@
     /**
      * APIFunction: toggle
      * Toggle the visibility of element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
     toggle: function() {
         for (var i=0, len=arguments.length; i<len; i++) {
             var element = OpenLayers.Util.getElement(arguments[i]);
-            var display = OpenLayers.Element.visible(element) ? 'hide' 
+            var display = OpenLayers.Element.visible(element) ? 'hide'
                                                               : 'show';
             OpenLayers.Element[display](element);
         }
@@ -3735,7 +3735,7 @@
     /**
      * APIFunction: hide
      * Hide element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
@@ -3749,7 +3749,7 @@
     /**
      * APIFunction: show
      * Show element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
@@ -3763,7 +3763,7 @@
     /**
      * APIFunction: remove
      * Remove the specified element from the DOM.
-     * 
+     *
      * Parameters:
      * element - {DOMElement}
      */
@@ -3774,10 +3774,10 @@
 
     /**
      * APIFunction: getHeight
-     *  
+     *
      * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer} The offset height of the element passed in
      */
@@ -3788,12 +3788,12 @@
 
     /**
      * APIFunction: getDimensions
-     *  
+     *
      * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
-     * {Object} Object with 'width' and 'height' properties which are the 
+     * {Object} Object with 'width' and 'height' properties which are the
      *          dimensions of the element passed in.
      */
     getDimensions: function(element) {
@@ -3801,7 +3801,7 @@
         if (OpenLayers.Element.getStyle(element, 'display') != 'none') {
             return {width: element.offsetWidth, height: element.offsetHeight};
         }
-    
+
         // All *Width and *Height properties give 0 on elements with display none,
         // so enable the element temporarily
         var els = element.style;
@@ -3833,7 +3833,7 @@
         var names = element.className;
         return (!!names && new RegExp("(^|\\s)" + name + "(\\s|$)").test(names));
     },
-    
+
     /**
      * Function: addClass
      * Add a CSS class name to an element.  Safe where element already has
@@ -3900,11 +3900,11 @@
 
     /**
      * APIFunction: getStyle
-     * 
+     *
      * Parameters:
      * element - {DOMElement}
      * style - {?}
-     * 
+     *
      * Returns:
      * {?}
      */
@@ -3915,24 +3915,24 @@
         if (element && element.style) {
             value = element.style[OpenLayers.String.camelize(style)];
             if (!value) {
-                if (document.defaultView && 
+                if (document.defaultView &&
                     document.defaultView.getComputedStyle) {
-                    
+
                     var css = document.defaultView.getComputedStyle(element, null);
                     value = css ? css.getPropertyValue(style) : null;
                 } else if (element.currentStyle) {
                     value = element.currentStyle[OpenLayers.String.camelize(style)];
                 }
             }
-        
+
             var positions = ['left', 'top', 'right', 'bottom'];
             if (window.opera &&
                 (OpenLayers.Util.indexOf(positions,style) != -1) &&
-                (OpenLayers.Element.getStyle(element, 'position') == 'static')) { 
+                (OpenLayers.Element.getStyle(element, 'position') == 'static')) {
                 value = 'auto';
             }
         }
-    
+
         return value == 'auto' ? null : value;
     }
 
@@ -3955,13 +3955,13 @@
  */
 OpenLayers.LonLat = OpenLayers.Class({
 
-    /** 
+    /**
      * APIProperty: lon
      * {Float} The x-axis coodinate in map units
      */
     lon: 0.0,
-    
-    /** 
+
+    /**
      * APIProperty: lat
      * {Float} The y-axis coordinate in map units
      */
@@ -3983,51 +3983,51 @@
         this.lon = OpenLayers.Util.toFloat(lon);
         this.lat = OpenLayers.Util.toFloat(lat);
     },
-    
+
     /**
      * Method: toString
      * Return a readable string version of the lonlat
      *
      * Returns:
-     * {String} String representation of OpenLayers.LonLat object. 
+     * {String} String representation of OpenLayers.LonLat object.
      *           (ex. <i>"lon=5,lat=42"</i>)
      */
     toString:function() {
         return ("lon=" + this.lon + ",lat=" + this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: toShortString
-     * 
+     *
      * Returns:
-     * {String} Shortened String representation of OpenLayers.LonLat object. 
+     * {String} Shortened String representation of OpenLayers.LonLat object.
      *         (ex. <i>"5, 42"</i>)
      */
     toShortString:function() {
         return (this.lon + ", " + this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: clone
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} New OpenLayers.LonLat object with the same lon 
+     * {<OpenLayers.LonLat>} New OpenLayers.LonLat object with the same lon
      *                       and lat values
      */
     clone:function() {
         return new OpenLayers.LonLat(this.lon, this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: add
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} A new OpenLayers.LonLat object with the lon and 
-     *                       lat passed-in added to this's. 
+     * {<OpenLayers.LonLat>} A new OpenLayers.LonLat object with the lon and
+     *                       lat passed-in added to this's.
      */
     add:function(lon, lat) {
         if ( (lon == null) || (lat == null) ) {
@@ -4038,15 +4038,15 @@
         return new OpenLayers.LonLat(this.lon + lon, this.lat + lat);
     },
 
-    /** 
+    /**
      * APIMethod: equals
-     * 
+     *
      * Parameters:
      * ll - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {Boolean} Boolean value indicating whether the passed-in 
-     *           <OpenLayers.LonLat> object has the same lon and lat 
+     * {Boolean} Boolean value indicating whether the passed-in
+     *           <OpenLayers.LonLat> object has the same lon and lat
      *           components as this.
      *           Note: if ll passed in is null, returns false
      */
@@ -4064,9 +4064,9 @@
      * Transform the LonLat object from source to dest. This transformation is
      *    *in place*: if you want a *new* lonlat, use .clone() first.
      *
-     * Parameters: 
-     * source - {<OpenLayers.Projection>} Source projection. 
-     * dest   - {<OpenLayers.Projection>} Destination projection. 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} Source projection.
+     * dest   - {<OpenLayers.Projection>} Destination projection.
      *
      * Returns:
      * {<OpenLayers.LonLat>} Itself, for use in chaining operations.
@@ -4078,56 +4078,56 @@
         this.lat = point.y;
         return this;
     },
-    
+
     /**
      * APIMethod: wrapDateLine
-     * 
+     *
      * Parameters:
      * maxExtent - {<OpenLayers.Bounds>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} A copy of this lonlat, but wrapped around the 
-     *                       "dateline" (as specified by the borders of 
+     * {<OpenLayers.LonLat>} A copy of this lonlat, but wrapped around the
+     *                       "dateline" (as specified by the borders of
      *                       maxExtent)
      */
-    wrapDateLine: function(maxExtent) {    
+    wrapDateLine: function(maxExtent) {
 
         var newLonLat = this.clone();
-    
+
         if (maxExtent) {
             //shift right?
             while (newLonLat.lon < maxExtent.left) {
                 newLonLat.lon +=  maxExtent.getWidth();
-            }    
-           
+            }
+
             //shift left?
             while (newLonLat.lon > maxExtent.right) {
                 newLonLat.lon -= maxExtent.getWidth();
-            }    
+            }
         }
-                
+
         return newLonLat;
     },
 
     CLASS_NAME: "OpenLayers.LonLat"
 });
 
-/** 
+/**
  * Function: fromString
- * Alternative constructor that builds a new <OpenLayers.LonLat> from a 
+ * Alternative constructor that builds a new <OpenLayers.LonLat> from a
  *     parameter string
- * 
+ *
  * Parameters:
- * str - {String} Comma-separated Lon,Lat coordinate string. 
+ * str - {String} Comma-separated Lon,Lat coordinate string.
  *                 (ex. <i>"5,40"</i>)
- * 
+ *
  * Returns:
- * {<OpenLayers.LonLat>} New <OpenLayers.LonLat> object built from the 
+ * {<OpenLayers.LonLat>} New <OpenLayers.LonLat> object built from the
  *                       passed-in String.
  */
 OpenLayers.LonLat.fromString = function(str) {
     var pair = str.split(",");
-    return new OpenLayers.LonLat(parseFloat(pair[0]), 
+    return new OpenLayers.LonLat(parseFloat(pair[0]),
                                  parseFloat(pair[1]));
 };
 /* ======================================================================
@@ -4147,7 +4147,7 @@
  * This class represents a screen coordinate, in x and y coordinates
  */
 OpenLayers.Pixel = OpenLayers.Class({
-    
+
     /**
      * APIProperty: x
      * {Number} The x coordinate
@@ -4159,7 +4159,7 @@
      * {Number} The y coordinate
      */
     y: 0.0,
-    
+
     /**
      * Constructor: OpenLayers.Pixel
      * Create a new OpenLayers.Pixel instance
@@ -4175,7 +4175,7 @@
         this.x = parseFloat(x);
         this.y = parseFloat(y);
     },
-    
+
     /**
      * Method: toString
      * Cast this object into a string
@@ -4195,9 +4195,9 @@
      * {<OpenLayers.Pixel>} A clone pixel
      */
     clone:function() {
-        return new OpenLayers.Pixel(this.x, this.y); 
+        return new OpenLayers.Pixel(this.x, this.y);
     },
-    
+
     /**
      * APIMethod: equals
      * Determine whether one pixel is equivalent to another
@@ -4226,7 +4226,7 @@
      * y - {Integer}
      *
      * Returns:
-     * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the 
+     * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the
      * values passed in.
      */
     add:function(x, y) {
@@ -4240,12 +4240,12 @@
 
     /**
     * APIMethod: offset
-    * 
+    *
     * Parameters
     * px - {<OpenLayers.Pixel>}
-    * 
+    *
     * Returns:
-    * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the 
+    * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the
     *                      x&y values of the pixel passed in.
     */
     offset:function(px) {
@@ -4269,62 +4269,62 @@
 
 /**
  * Class: OpenLayers.Icon
- * 
+ *
  * The icon represents a graphical icon on the screen.  Typically used in
  * conjunction with a <OpenLayers.Marker> to represent markers on a screen.
  *
- * An icon has a url, size and position.  It also contains an offset which 
+ * An icon has a url, size and position.  It also contains an offset which
  * allows the center point to be represented correctly.  This can be
  * provided either as a fixed offset or a function provided to calculate
- * the desired offset. 
- * 
+ * the desired offset.
+ *
  */
 OpenLayers.Icon = OpenLayers.Class({
-    
-    /** 
-     * Property: url 
+
+    /**
+     * Property: url
      * {String}  image url
      */
     url: null,
-    
-    /** 
-     * Property: size 
-     * {<OpenLayers.Size>} 
+
+    /**
+     * Property: size
+     * {<OpenLayers.Size>}
      */
     size: null,
 
-    /** 
-     * Property: offset 
+    /**
+     * Property: offset
      * {<OpenLayers.Pixel>} distance in pixels to offset the image when being rendered
      */
-    offset: null,    
-    
-    /** 
-     * Property: calculateOffset 
-     * {<OpenLayers.Pixel>} Function to calculate the offset (based on the size) 
+    offset: null,
+
+    /**
+     * Property: calculateOffset
+     * {<OpenLayers.Pixel>} Function to calculate the offset (based on the size)
      */
-    calculateOffset: null,    
-    
-    /** 
-     * Property: imageDiv 
-     * {DOMElement} 
+    calculateOffset: null,
+
+    /**
+     * Property: imageDiv
+     * {DOMElement}
      */
     imageDiv: null,
 
-    /** 
-     * Property: px 
-     * {<OpenLayers.Pixel>} 
+    /**
+     * Property: px
+     * {<OpenLayers.Pixel>}
      */
     px: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Icon
-     * Creates an icon, which is an image tag in a div.  
+     * Creates an icon, which is an image tag in a div.
      *
-     * url - {String} 
-     * size - {<OpenLayers.Size>} 
+     * url - {String}
+     * size - {<OpenLayers.Size>}
      * offset - {<OpenLayers.Pixel>}
-     * calculateOffset - {Function} 
+     * calculateOffset - {Function}
      */
     initialize: function(url, size, offset, calculateOffset) {
         this.url = url;
@@ -4335,39 +4335,39 @@
         var id = OpenLayers.Util.createUniqueID("OL_Icon_");
         this.imageDiv = OpenLayers.Util.createAlphaImageDiv(id);
     },
-    
-    /** 
+
+    /**
      * Method: destroy
-     * Nullify references and remove event listeners to prevent circular 
+     * Nullify references and remove event listeners to prevent circular
      * references and memory leaks
      */
     destroy: function() {
         // erase any drawn elements
         this.erase();
 
-        OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); 
+        OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);
         this.imageDiv.innerHTML = "";
         this.imageDiv = null;
     },
 
-    /** 
+    /**
      * Method: clone
-     * 
+     *
      * Returns:
      * {<OpenLayers.Icon>} A fresh copy of the icon.
      */
     clone: function() {
-        return new OpenLayers.Icon(this.url, 
-                                   this.size, 
-                                   this.offset, 
+        return new OpenLayers.Icon(this.url,
+                                   this.size,
+                                   this.offset,
                                    this.calculateOffset);
     },
-    
+
     /**
      * Method: setSize
-     * 
+     *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         if (size != null) {
@@ -4375,12 +4375,12 @@
         }
         this.draw();
     },
-    
+
     /**
      * Method: setUrl
-     * 
+     *
      * Parameters:
-     * url - {String} 
+     * url - {String}
      */
     setUrl: function(url) {
         if (url != null) {
@@ -4389,28 +4389,28 @@
         this.draw();
     },
 
-    /** 
+    /**
      * Method: draw
      * Move the div to the given pixel.
-     * 
+     *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
-     * 
+     * px - {<OpenLayers.Pixel>}
+     *
      * Returns:
      * {DOMElement} A new DOM Image of this icon set at the location passed-in
      */
     draw: function(px) {
-        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, 
-                                            null, 
-                                            null, 
-                                            this.size, 
-                                            this.url, 
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,
+                                            null,
+                                            null,
+                                            this.size,
+                                            this.url,
                                             "absolute");
         this.moveTo(px);
         return this.imageDiv;
-    }, 
+    },
 
-    /** 
+    /**
      * Method: erase
      * Erase the underlying image element.
      *
@@ -4419,27 +4419,27 @@
         if (this.imageDiv != null && this.imageDiv.parentNode != null) {
             OpenLayers.Element.remove(this.imageDiv);
         }
-    }, 
-    
-    /** 
+    },
+
+    /**
      * Method: setOpacity
      * Change the icon's opacity
      *
      * Parameters:
-     * opacity - {float} 
+     * opacity - {float}
      */
     setOpacity: function(opacity) {
-        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, 
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null,
                                             null, null, null, null, opacity);
 
     },
-    
+
     /**
      * Method: moveTo
      * move icon to passed in px.
      *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
+     * px - {<OpenLayers.Pixel>}
      */
     moveTo: function (px) {
         //if no px passed in, use stored location
@@ -4452,39 +4452,39 @@
                 this.display(false);
             } else {
                 if (this.calculateOffset) {
-                    this.offset = this.calculateOffset(this.size);  
+                    this.offset = this.calculateOffset(this.size);
                 }
                 var offsetPx = this.px.offset(this.offset);
                 OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, offsetPx);
             }
         }
     },
-    
-    /** 
+
+    /**
      * Method: display
      * Hide or show the icon
      *
      * Parameters:
-     * display - {Boolean} 
+     * display - {Boolean}
      */
     display: function(display) {
-        this.imageDiv.style.display = (display) ? "" : "none"; 
+        this.imageDiv.style.display = (display) ? "" : "none";
     },
-    
 
+
     /**
      * APIMethod: isDrawn
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the icon is drawn.
      */
     isDrawn: function() {
         // nodeType 11 for ie, whose nodes *always* have a parentNode
         // (of type document fragment)
-        var isDrawn = (this.imageDiv && this.imageDiv.parentNode && 
-                       (this.imageDiv.parentNode.nodeType != 11));    
+        var isDrawn = (this.imageDiv && this.imageDiv.parentNode &&
+                       (this.imageDiv.parentNode.nodeType != 11));
 
-        return isDrawn;   
+        return isDrawn;
     },
 
     CLASS_NAME: "OpenLayers.Icon"
@@ -4501,104 +4501,104 @@
 /**
  * Class: OpenLayers.Popup
  * A popup is a small div that can opened and closed on the map.
- * Typically opened in response to clicking on a marker.  
+ * Typically opened in response to clicking on a marker.
  * See <OpenLayers.Marker>.  Popup's don't require their own
  * layer and are added the the map using the <OpenLayers.Map.addPopup>
  * method.
  *
  * Example:
  * (code)
- * popup = new OpenLayers.Popup("chicken", 
+ * popup = new OpenLayers.Popup("chicken",
  *                    new OpenLayers.LonLat(5,40),
  *                    new OpenLayers.Size(200,200),
  *                    "example popup",
  *                    true);
- *       
+ *
  * map.addPopup(popup);
  * (end)
  */
 OpenLayers.Popup = OpenLayers.Class({
 
-    /** 
-     * Property: events  
-     * {<OpenLayers.Events>} custom event manager 
+    /**
+     * Property: events
+     * {<OpenLayers.Events>} custom event manager
      */
     events: null,
-    
+
     /** Property: id
      * {String} the unique identifier assigned to this popup.
      */
     id: "",
 
-    /** 
-     * Property: lonlat 
+    /**
+     * Property: lonlat
      * {<OpenLayers.LonLat>} the position of this popup on the map
      */
     lonlat: null,
 
-    /** 
-     * Property: div 
+    /**
+     * Property: div
      * {DOMElement} the div that contains this popup.
      */
     div: null,
 
-    /** 
-     * Property: contentSize 
+    /**
+     * Property: contentSize
      * {<OpenLayers.Size>} the width and height of the content.
      */
-    contentSize: null,    
+    contentSize: null,
 
-    /** 
-     * Property: size 
+    /**
+     * Property: size
      * {<OpenLayers.Size>} the width and height of the popup.
      */
-    size: null,    
+    size: null,
 
-    /** 
-     * Property: contentHTML 
+    /**
+     * Property: contentHTML
      * {String} An HTML string for this popup to display.
      */
     contentHTML: null,
-    
-    /** 
-     * Property: backgroundColor 
+
+    /**
+     * Property: backgroundColor
      * {String} the background color used by the popup.
      */
     backgroundColor: "",
-    
-    /** 
-     * Property: opacity 
+
+    /**
+     * Property: opacity
      * {float} the opacity of this popup (between 0.0 and 1.0)
      */
     opacity: "",
 
-    /** 
-     * Property: border 
+    /**
+     * Property: border
      * {String} the border size of the popup.  (eg 2px)
      */
     border: "",
-    
-    /** 
-     * Property: contentDiv 
+
+    /**
+     * Property: contentDiv
      * {DOMElement} a reference to the element that holds the content of
      *              the div.
      */
     contentDiv: null,
-    
-    /** 
-     * Property: groupDiv 
+
+    /**
+     * Property: groupDiv
      * {DOMElement} First and only child of 'div'. The group Div contains the
      *     'contentDiv' and the 'closeDiv'.
      */
     groupDiv: null,
 
-    /** 
+    /**
      * Property: closeDiv
      * {DOMElement} the optional closer image
      */
     closeDiv: null,
 
-    /** 
+    /**
      * APIProperty: autoSize
      * {Boolean} Resize the popup to auto-fit the contents.
      *     Default is false.
@@ -4617,40 +4617,40 @@
      */
     maxSize: null,
 
-    /** 
+    /**
      * Property: displayClass
      * {String} The CSS class of the popup.
      */
     displayClass: "olPopup",
 
-    /** 
+    /**
      * Property: contentDisplayClass
      * {String} The CSS class of the popup content div.
      */
     contentDisplayClass: "olPopupContent",
 
-    /** 
-     * Property: padding 
-     * {int or <OpenLayers.Bounds>} An extra opportunity to specify internal 
+    /**
+     * Property: padding
+     * {int or <OpenLayers.Bounds>} An extra opportunity to specify internal
      *     padding of the content div inside the popup. This was originally
-     *     confused with the css padding as specified in style.css's 
+     *     confused with the css padding as specified in style.css's
      *     'olPopupContent' class. We would like to get rid of this altogether,
      *     except that it does come in handy for the framed and anchoredbubble
-     *     popups, who need to maintain yet another barrier between their 
-     *     content and the outer border of the popup itself. 
-     * 
-     *     Note that in order to not break API, we must continue to support 
-     *     this property being set as an integer. Really, though, we'd like to 
+     *     popups, who need to maintain yet another barrier between their
+     *     content and the outer border of the popup itself.
+     *
+     *     Note that in order to not break API, we must continue to support
+     *     this property being set as an integer. Really, though, we'd like to
      *     have this specified as a Bounds object so that user can specify
      *     distinct left, top, right, bottom paddings. With the 3.0 release
      *     we can make this only a bounds.
      */
     padding: 0,
 
-    /** 
+    /**
      * Property: disableFirefoxOverflowHack
-     * {Boolean} The hack for overflow in Firefox causes all elements 
-     *     to be re-drawn, which causes Flash elements to be 
+     * {Boolean} The hack for overflow in Firefox causes all elements
+     *     to be re-drawn, which causes Flash elements to be
      *     re-initialized, which is troublesome.
      *     With this property the hack can be disabled.
      */
@@ -4658,8 +4658,8 @@
 
     /**
      * Method: fixPadding
-     * To be removed in 3.0, this function merely helps us to deal with the 
-     *     case where the user may have set an integer value for padding, 
+     * To be removed in 3.0, this function merely helps us to deal with the
+     *     case where the user may have set an integer value for padding,
      *     instead of an <OpenLayers.Bounds> object.
      */
     fixPadding: function() {
@@ -4677,17 +4677,17 @@
      *     Default is false.
      */
     panMapIfOutOfView: false,
-    
+
     /**
-     * APIProperty: keepInMap 
-     * {Boolean} If panMapIfOutOfView is false, and this property is true, 
+     * APIProperty: keepInMap
+     * {Boolean} If panMapIfOutOfView is false, and this property is true,
      *     contrain the popup such that it always fits in the available map
      *     space. By default, this is not set on the base class. If you are
      *     creating popups that are near map edges and not allowing pannning,
      *     and especially if you have a popup which has a
      *     fixedRelativePosition, setting this to false may be a smart thing to
      *     do. Subclasses may want to override this setting.
-     *   
+     *
      *     Default is false.
      */
     keepInMap: false,
@@ -4698,24 +4698,24 @@
      *     Default is false.
      */
     closeOnMove: false,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} this gets set in Map.js when the popup is added to the map
      */
     map: null,
 
-    /** 
+    /**
     * Constructor: OpenLayers.Popup
     * Create a popup.
-    * 
-    * Parameters: 
+    *
+    * Parameters:
     * id - {String} a unqiue identifier for this popup.  If null is passed
-    *               an identifier will be automatically generated. 
+    *               an identifier will be automatically generated.
     * lonlat - {<OpenLayers.LonLat>}  The position on the map the popup will
     *                                 be shown.
     * contentSize - {<OpenLayers.Size>} The size of the content.
-    * contentHTML - {String}          An HTML string to display inside the   
+    * contentHTML - {String}          An HTML string to display inside the
     *                                 popup.
     * closeBox - {Boolean}            Whether to display a close box inside
     *                                 the popup.
@@ -4729,28 +4729,28 @@
         this.id = id;
         this.lonlat = lonlat;
 
-        this.contentSize = (contentSize != null) ? contentSize 
+        this.contentSize = (contentSize != null) ? contentSize
                                   : new OpenLayers.Size(
                                                    OpenLayers.Popup.WIDTH,
                                                    OpenLayers.Popup.HEIGHT);
-        if (contentHTML != null) { 
+        if (contentHTML != null) {
              this.contentHTML = contentHTML;
         }
         this.backgroundColor = OpenLayers.Popup.COLOR;
         this.opacity = OpenLayers.Popup.OPACITY;
         this.border = OpenLayers.Popup.BORDER;
 
-        this.div = OpenLayers.Util.createDiv(this.id, null, null, 
+        this.div = OpenLayers.Util.createDiv(this.id, null, null,
                                              null, null, null, "hidden");
         this.div.className = this.displayClass;
-        
+
         var groupDivId = this.id + "_GroupDiv";
-        this.groupDiv = OpenLayers.Util.createDiv(groupDivId, null, null, 
+        this.groupDiv = OpenLayers.Util.createDiv(groupDivId, null, null,
                                                     null, "relative", null,
                                                     "hidden");
 
         var id = this.div.id + "_contentDiv";
-        this.contentDiv = OpenLayers.Util.createDiv(id, null, this.contentSize.clone(), 
+        this.contentDiv = OpenLayers.Util.createDiv(id, null, this.contentSize.clone(),
                                                     null, "relative");
         this.contentDiv.className = this.contentDisplayClass;
         this.groupDiv.appendChild(this.contentDiv);
@@ -4758,12 +4758,12 @@
 
         if (closeBox) {
             this.addCloseBox(closeBoxCallback);
-        } 
+        }
 
         this.registerEvents();
     },
 
-    /** 
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -4773,24 +4773,24 @@
         this.lonlat = null;
         this.size = null;
         this.contentHTML = null;
-        
+
         this.backgroundColor = null;
         this.opacity = null;
         this.border = null;
-        
+
         if (this.closeOnMove && this.map) {
             this.map.events.unregister("movestart", this, this.hide);
         }
 
         this.events.destroy();
         this.events = null;
-        
+
         if (this.closeDiv) {
-            OpenLayers.Event.stopObservingElement(this.closeDiv); 
+            OpenLayers.Event.stopObservingElement(this.closeDiv);
             this.groupDiv.removeChild(this.closeDiv);
         }
         this.closeDiv = null;
-        
+
         this.div.removeChild(this.groupDiv);
         this.groupDiv = null;
 
@@ -4799,7 +4799,7 @@
         }
         this.map = null;
         this.div = null;
-        
+
         this.autoSize = null;
         this.minSize = null;
         this.maxSize = null;
@@ -4807,13 +4807,13 @@
         this.panMapIfOutOfView = null;
     },
 
-    /** 
+    /**
     * Method: draw
     * Constructs the elements that make up the popup.
     *
     * Parameters:
     * px - {<OpenLayers.Pixel>} the position the popup in pixels.
-    * 
+    *
     * Returns:
     * {DOMElement} Reference to a div that contains the drawn popup
     */
@@ -4824,12 +4824,12 @@
             }
         }
 
-        // this assumes that this.map already exists, which is okay because 
+        // this assumes that this.map already exists, which is okay because
         // this.draw is only called once the popup has been added to the map.
         if (this.closeOnMove) {
             this.map.events.register("movestart", this, this.hide);
         }
-        
+
         //listen to movestart, moveend to disable overflow (FF bug)
         if (!this.disableFirefoxOverflowHack && OpenLayers.Util.getBrowserName() == 'firefox') {
             this.map.events.register("movestart", this, function() {
@@ -4859,33 +4859,33 @@
         this.setOpacity();
         this.setBorder();
         this.setContentHTML();
-        
+
         if (this.panMapIfOutOfView) {
             this.panIntoView();
-        }    
+        }
 
         return this.div;
     },
 
-    /** 
+    /**
      * Method: updatePosition
-     * if the popup has a lonlat and its map members set, 
+     * if the popup has a lonlat and its map members set,
      * then have it move itself to its proper position
      */
     updatePosition: function() {
         if ((this.lonlat) && (this.map)) {
             var px = this.map.getLayerPxFromLonLat(this.lonlat);
             if (px) {
-                this.moveTo(px);           
-            }    
+                this.moveTo(px);
+            }
         }
     },
 
     /**
      * Method: moveTo
-     * 
+     *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} the top and left position of the popup div. 
+     * px - {<OpenLayers.Pixel>} the top and left position of the popup div.
      */
     moveTo: function(px) {
         if ((px != null) && (this.div != null)) {
@@ -4897,7 +4897,7 @@
     /**
      * Method: visible
      *
-     * Returns:      
+     * Returns:
      * {Boolean} Boolean indicating whether or not the popup is visible
      */
     visible: function() {
@@ -4925,7 +4925,7 @@
 
         if (this.panMapIfOutOfView) {
             this.panIntoView();
-        }    
+        }
     },
 
     /**
@@ -4938,17 +4938,17 @@
 
     /**
      * Method: setSize
-     * Used to adjust the size of the popup. 
+     * Used to adjust the size of the popup.
      *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
-        this.size = contentSize.clone(); 
-        
-        // if our contentDiv has a css 'padding' set on it by a stylesheet, we 
-        //  must add that to the desired "size". 
+    setSize:function(contentSize) {
+        this.size = contentSize.clone();
+
+        // if our contentDiv has a css 'padding' set on it by a stylesheet, we
+        //  must add that to the desired "size".
         var contentDivPadding = this.getContentDivPadding();
         var wPadding = contentDivPadding.left + contentDivPadding.right;
         var hPadding = contentDivPadding.top + contentDivPadding.bottom;
@@ -4964,18 +4964,18 @@
             wPadding += closeDivWidth + contentDivPadding.right;
         }
 
-        //increase size of the main popup div to take into account the 
-        // users's desired padding and close div.        
+        //increase size of the main popup div to take into account the
+        // users's desired padding and close div.
         this.size.w += wPadding;
         this.size.h += hPadding;
 
-        //now if our browser is IE, we need to actually make the contents 
-        // div itself bigger to take its own padding into effect. this makes 
+        //now if our browser is IE, we need to actually make the contents
+        // div itself bigger to take its own padding into effect. this makes
         // me want to shoot someone, but so it goes.
         if (OpenLayers.Util.getBrowserName() == "msie") {
-            this.contentSize.w += 
+            this.contentSize.w +=
                 contentDivPadding.left + contentDivPadding.right;
-            this.contentSize.h += 
+            this.contentSize.h +=
                 contentDivPadding.bottom + contentDivPadding.top;
         }
 
@@ -4987,26 +4987,26 @@
             this.contentDiv.style.width = contentSize.w + "px";
             this.contentDiv.style.height = contentSize.h + "px";
         }
-    },  
+    },
 
     /**
      * APIMethod: updateSize
-     * Auto size the popup so that it precisely fits its contents (as 
+     * Auto size the popup so that it precisely fits its contents (as
      *     determined by this.contentDiv.innerHTML). Popup size will, of
      *     course, be limited by the available space on the current map
      */
     updateSize: function() {
-        
+
         // determine actual render dimensions of the contents by putting its
         // contents into a fake contentDiv (for the CSS) and then measuring it
-        var preparedHTML = "<div class='" + this.contentDisplayClass+ "'>" + 
-            this.contentDiv.innerHTML + 
+        var preparedHTML = "<div class='" + this.contentDisplayClass+ "'>" +
+            this.contentDiv.innerHTML +
             "</div>";
- 
+
         var containerElement = (this.map) ? this.map.layerContainerDiv
-        								  : document.body;
+                                          : document.body;
         var realSize = OpenLayers.Util.getRenderedDimensions(
-            preparedHTML, null,	{
+            preparedHTML, null, {
                 displayClass: this.displayClass,
                 containerElement: containerElement
             }
@@ -5017,25 +5017,25 @@
 
         var newSize = null;
         if (safeSize.equals(realSize)) {
-            //real size of content is small enough to fit on the map, 
+            //real size of content is small enough to fit on the map,
             // so we use real size.
             newSize = realSize;
 
         } else {
 
-            //make a new OL.Size object with the clipped dimensions 
+            //make a new OL.Size object with the clipped dimensions
             // set or null if not clipped.
             var fixedSize = new OpenLayers.Size();
             fixedSize.w = (safeSize.w < realSize.w) ? safeSize.w : null;
             fixedSize.h = (safeSize.h < realSize.h) ? safeSize.h : null;
-        
+
             if (fixedSize.w && fixedSize.h) {
-                //content is too big in both directions, so we will use 
-                // max popup size (safeSize), knowing well that it will 
-                // overflow both ways.                
+                //content is too big in both directions, so we will use
+                // max popup size (safeSize), knowing well that it will
+                // overflow both ways.
                 newSize = safeSize;
             } else {
-                //content is clipped in only one direction, so we need to 
+                //content is clipped in only one direction, so we need to
                 // run getRenderedDimensions() again with a fixed dimension
                 var clippedSize = OpenLayers.Util.getRenderedDimensions(
                     preparedHTML, fixedSize, {
@@ -5043,17 +5043,17 @@
                         containerElement: containerElement
                     }
                 );
-                
-                //if the clipped size is still the same as the safeSize, 
-                // that means that our content must be fixed in the 
-                // offending direction. If overflow is 'auto', this means 
-                // we are going to have a scrollbar for sure, so we must 
+
+                //if the clipped size is still the same as the safeSize,
+                // that means that our content must be fixed in the
+                // offending direction. If overflow is 'auto', this means
+                // we are going to have a scrollbar for sure, so we must
                 // adjust for that.
                 //
                 var currentOverflow = OpenLayers.Element.getStyle(
                     this.contentDiv, "overflow"
                 );
-                if ( (currentOverflow != "hidden") && 
+                if ( (currentOverflow != "hidden") &&
                      (clippedSize.equals(safeSize)) ) {
                     var scrollBar = OpenLayers.Util.getScrollbarWidth();
                     if (fixedSize.w) {
@@ -5062,12 +5062,12 @@
                         clippedSize.w += scrollBar;
                     }
                 }
-                
+
                 newSize = this.getSafeContentSize(clippedSize);
             }
-        }                        
-        this.setSize(newSize);     
-    },    
+        }
+        this.setSize(newSize);
+    },
 
     /**
      * Method: setBackgroundColor
@@ -5076,28 +5076,28 @@
      * Parameters:
      * color - {String} the background color.  eg "#FFBBBB"
      */
-    setBackgroundColor:function(color) { 
+    setBackgroundColor:function(color) {
         if (color != undefined) {
-            this.backgroundColor = color; 
+            this.backgroundColor = color;
         }
-        
+
         if (this.div != null) {
             this.div.style.backgroundColor = this.backgroundColor;
         }
-    },  
-    
+    },
+
     /**
      * Method: setOpacity
      * Sets the opacity of the popup.
-     * 
+     *
      * Parameters:
-     * opacity - {float} A value between 0.0 (transparent) and 1.0 (solid).   
+     * opacity - {float} A value between 0.0 (transparent) and 1.0 (solid).
      */
-    setOpacity:function(opacity) { 
+    setOpacity:function(opacity) {
         if (opacity != undefined) {
-            this.opacity = opacity; 
+            this.opacity = opacity;
         }
-        
+
         if (this.div != null) {
             // for Mozilla and Safari
             this.div.style.opacity = this.opacity;
@@ -5105,25 +5105,25 @@
             // for IE
             this.div.style.filter = 'alpha(opacity=' + this.opacity*100 + ')';
         }
-    },  
-    
+    },
+
     /**
      * Method: setBorder
      * Sets the border style of the popup.
      *
      * Parameters:
-     * border - {String} The border style value. eg 2px 
+     * border - {String} The border style value. eg 2px
      */
-    setBorder:function(border) { 
+    setBorder:function(border) {
         if (border != undefined) {
             this.border = border;
         }
-        
+
         if (this.div != null) {
             this.div.style.border = this.border;
         }
-    },      
-    
+    },
+
     /**
      * Method: setContentHTML
      * Allows the user to set the HTML content of the popup.
@@ -5136,15 +5136,15 @@
         if (contentHTML != null) {
             this.contentHTML = contentHTML;
         }
-       
-        if ((this.contentDiv != null) && 
+
+        if ((this.contentDiv != null) &&
             (this.contentHTML != null) &&
             (this.contentHTML != this.contentDiv.innerHTML)) {
-       
+
             this.contentDiv.innerHTML = this.contentHTML;
-       
+
             if (this.autoSize) {
-                
+
                 //if popup has images, listen for when they finish
                 // loading and resize accordingly
                 this.registerImageListeners();
@@ -5152,31 +5152,31 @@
                 //auto size the popup to its current contents
                 this.updateSize();
             }
-        }    
+        }
 
     },
-    
+
     /**
      * Method: registerImageListeners
      * Called when an image contained by the popup loaded. this function
      *     updates the popup size, then unregisters the image load listener.
-     */   
-    registerImageListeners: function() { 
+     */
+    registerImageListeners: function() {
 
-        // As the images load, this function will call updateSize() to 
+        // As the images load, this function will call updateSize() to
         // resize the popup to fit the content div (which presumably is now
         // bigger than when the image was not loaded).
-        // 
+        //
         // If the 'panMapIfOutOfView' property is set, we will pan the newly
         // resized popup back into view.
-        // 
-        // Note that this function, when called, will have 'popup' and 
+        //
+        // Note that this function, when called, will have 'popup' and
         // 'img' properties in the context.
         //
         var onImgLoad = function() {
-            
+
             this.popup.updateSize();
-     
+
             if ( this.popup.visible() && this.popup.panMapIfOutOfView ) {
                 this.popup.panIntoView();
             }
@@ -5184,12 +5184,12 @@
             OpenLayers.Event.stopObserving(
                 this.img, "load", this.img._onImageLoad
             );
-    
+
         };
 
-        //cycle through the images and if their size is 0x0, that means that 
-        // they haven't been loaded yet, so we attach the listener, which 
-        // will fire when the images finish loading and will resize the 
+        //cycle through the images and if their size is 0x0, that means that
+        // they haven't been loaded yet, so we attach the listener, which
+        // will fire when the images finish loading and will resize the
         // popup accordingly to its new size.
         var images = this.contentDiv.getElementsByTagName("img");
         for (var i = 0, len = images.length; i < len; i++) {
@@ -5206,27 +5206,27 @@
                 img._onImgLoad = OpenLayers.Function.bind(onImgLoad, context);
 
                 OpenLayers.Event.observe(img, 'load', img._onImgLoad);
-            }    
-        } 
+            }
+        }
     },
 
     /**
      * APIMethod: getSafeContentSize
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>} Desired size to make the popup.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Size>} A size to make the popup which is neither smaller
-     *     than the specified minimum size, nor bigger than the maximum 
+     *     than the specified minimum size, nor bigger than the maximum
      *     size (which is calculated relative to the size of the viewport).
      */
     getSafeContentSize: function(size) {
 
         var safeContentSize = size.clone();
 
-        // if our contentDiv has a css 'padding' set on it by a stylesheet, we 
-        //  must add that to the desired "size". 
+        // if our contentDiv has a css 'padding' set on it by a stylesheet, we
+        //  must add that to the desired "size".
         var contentDivPadding = this.getContentDivPadding();
         var wPadding = contentDivPadding.left + contentDivPadding.right;
         var hPadding = contentDivPadding.top + contentDivPadding.bottom;
@@ -5243,25 +5243,25 @@
 
         // prevent the popup from being smaller than a specified minimal size
         if (this.minSize) {
-            safeContentSize.w = Math.max(safeContentSize.w, 
+            safeContentSize.w = Math.max(safeContentSize.w,
                 (this.minSize.w - wPadding));
-            safeContentSize.h = Math.max(safeContentSize.h, 
+            safeContentSize.h = Math.max(safeContentSize.h,
                 (this.minSize.h - hPadding));
         }
 
         // prevent the popup from being bigger than a specified maximum size
         if (this.maxSize) {
-            safeContentSize.w = Math.min(safeContentSize.w, 
+            safeContentSize.w = Math.min(safeContentSize.w,
                 (this.maxSize.w - wPadding));
-            safeContentSize.h = Math.min(safeContentSize.h, 
+            safeContentSize.h = Math.min(safeContentSize.h,
                 (this.maxSize.h - hPadding));
         }
-        
-        //make sure the desired size to set doesn't result in a popup that 
+
+        //make sure the desired size to set doesn't result in a popup that
         // is bigger than the map's viewport.
         //
         if (this.map && this.map.size) {
-            
+
             var extraX = 0, extraY = 0;
             if (this.keepInMap && !this.panMapIfOutOfView) {
                 var px = this.map.getPixelFromLonLat(this.lonlat);
@@ -5282,39 +5282,39 @@
                         extraX = px.x;
                         extraY = px.y;
                         break;
-                    default:    
+                    default:
                         extraX = px.x;
                         extraY = this.map.size.h - px.y;
                         break;
                 }
-            }    
-          
-            var maxY = this.map.size.h - 
-                this.map.paddingForPopups.top - 
-                this.map.paddingForPopups.bottom - 
+            }
+
+            var maxY = this.map.size.h -
+                this.map.paddingForPopups.top -
+                this.map.paddingForPopups.bottom -
                 hPadding - extraY;
-            
-            var maxX = this.map.size.w - 
-                this.map.paddingForPopups.left - 
-                this.map.paddingForPopups.right - 
+
+            var maxX = this.map.size.w -
+                this.map.paddingForPopups.left -
+                this.map.paddingForPopups.right -
                 wPadding - extraX;
-            
+
             safeContentSize.w = Math.min(safeContentSize.w, maxX);
             safeContentSize.h = Math.min(safeContentSize.h, maxY);
         }
-        
+
         return safeContentSize;
     },
-    
+
     /**
      * Method: getContentDivPadding
-     * Glorious, oh glorious hack in order to determine the css 'padding' of 
-     *     the contentDiv. IE/Opera return null here unless we actually add the 
-     *     popup's main 'div' element (which contains contentDiv) to the DOM. 
-     *     So we make it invisible and then add it to the document temporarily. 
+     * Glorious, oh glorious hack in order to determine the css 'padding' of
+     *     the contentDiv. IE/Opera return null here unless we actually add the
+     *     popup's main 'div' element (which contains contentDiv) to the DOM.
+     *     So we make it invisible and then add it to the document temporarily.
      *
-     *     Once we've taken the padding readings we need, we then remove it 
-     *     from the DOM (it will actually get added to the DOM in 
+     *     Once we've taken the padding readings we need, we then remove it
+     *     from the DOM (it will actually get added to the DOM in
      *     Map.js's addPopup)
      *
      * Returns:
@@ -5326,27 +5326,27 @@
         var contentDivPadding = this._contentDivPadding;
         if (!contentDivPadding) {
 
-        	if (this.div.parentNode == null) {
-	        	//make the div invisible and add it to the page        
-	            this.div.style.display = "none";
-	            document.body.appendChild(this.div);
-	    	}
-	            
-            //read the padding settings from css, put them in an OL.Bounds        
+            if (this.div.parentNode == null) {
+                //make the div invisible and add it to the page
+                this.div.style.display = "none";
+                document.body.appendChild(this.div);
+            }
+
+            //read the padding settings from css, put them in an OL.Bounds
             contentDivPadding = new OpenLayers.Bounds(
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-left"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-bottom"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-right"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-top")
             );
-    
+
             //cache the value
             this._contentDivPadding = contentDivPadding;
 
             if (this.div.parentNode == document.body) {
-	            //remove the div from the page and make it visible again
-	            document.body.removeChild(this.div);
-	            this.div.style.display = "";
+                //remove the div from the page and make it visible again
+                document.body.removeChild(this.div);
+                this.div.style.display = "";
             }
         }
         return contentDivPadding;
@@ -5354,7 +5354,7 @@
 
     /**
      * Method: addCloseBox
-     * 
+     *
      * Parameters:
      * callback - {Function} The callback to be called when the close button
      *     is clicked.
@@ -5364,12 +5364,12 @@
         this.closeDiv = OpenLayers.Util.createDiv(
             this.id + "_close", null, new OpenLayers.Size(17, 17)
         );
-        this.closeDiv.className = "olPopupCloseBox"; 
-        
+        this.closeDiv.className = "olPopupCloseBox";
+
         // use the content div's css padding to determine if we should
         //  padd the close div
         var contentDivPadding = this.getContentDivPadding();
-         
+
         this.closeDiv.style.right = contentDivPadding.right + "px";
         this.closeDiv.style.top = contentDivPadding.top + "px";
         this.groupDiv.appendChild(this.closeDiv);
@@ -5378,7 +5378,7 @@
             this.hide();
             OpenLayers.Event.stop(e);
         };
-        OpenLayers.Event.observe(this.closeDiv, "click", 
+        OpenLayers.Event.observe(this.closeDiv, "click",
                 OpenLayers.Function.bindAsEventListener(closePopup, this));
     },
 
@@ -5387,58 +5387,58 @@
      * Pans the map such that the popup is totaly viewable (if necessary)
      */
     panIntoView: function() {
-        
+
         var mapSize = this.map.getSize();
-    
-        //start with the top left corner of the popup, in px, 
+
+        //start with the top left corner of the popup, in px,
         // relative to the viewport
         var origTL = this.map.getViewPortPxFromLayerPx( new OpenLayers.Pixel(
             parseInt(this.div.style.left),
             parseInt(this.div.style.top)
         ));
         var newTL = origTL.clone();
-    
+
         //new left (compare to margins, using this.size to calculate right)
         if (origTL.x < this.map.paddingForPopups.left) {
             newTL.x = this.map.paddingForPopups.left;
-        } else 
+        } else
         if ( (origTL.x + this.size.w) > (mapSize.w - this.map.paddingForPopups.right)) {
             newTL.x = mapSize.w - this.map.paddingForPopups.right - this.size.w;
         }
-        
+
         //new top (compare to margins, using this.size to calculate bottom)
         if (origTL.y < this.map.paddingForPopups.top) {
             newTL.y = this.map.paddingForPopups.top;
-        } else 
+        } else
         if ( (origTL.y + this.size.h) > (mapSize.h - this.map.paddingForPopups.bottom)) {
             newTL.y = mapSize.h - this.map.paddingForPopups.bottom - this.size.h;
         }
-        
+
         var dx = origTL.x - newTL.x;
         var dy = origTL.y - newTL.y;
-        
+
         this.map.pan(dx, dy);
     },
 
-    /** 
+    /**
      * Method: registerEvents
      * Registers events on the popup.
      *
-     * Do this in a separate function so that subclasses can 
+     * Do this in a separate function so that subclasses can
      *   choose to override it if they wish to deal differently
      *   with mouse events
-     * 
+     *
      *   Note in the following handler functions that some special
-     *    care is needed to deal correctly with mousing and popups. 
-     *   
+     *    care is needed to deal correctly with mousing and popups.
+     *
      *   Because the user might select the zoom-rectangle option and
      *    then drag it over a popup, we need a safe way to allow the
      *    mousemove and mouseup events to pass through the popup when
      *    they are initiated from outside.
-     * 
+     *
      *   Otherwise, we want to essentially kill the event propagation
-     *    for all other events, though we have to do so carefully, 
-     *    without disabling basic html functionality, like clicking on 
+     *    for all other events, though we have to do so carefully,
+     *    without disabling basic html functionality, like clicking on
      *    hyperlinks or drag-selecting text.
      */
      registerEvents:function() {
@@ -5453,31 +5453,31 @@
             "dblclick": this.ondblclick,
             scope: this
         });
-        
+
      },
 
-    /** 
-     * Method: onmousedown 
+    /**
+     * Method: onmousedown
      * When mouse goes down within the popup, make a note of
-     *   it locally, and then do not propagate the mousedown 
+     *   it locally, and then do not propagate the mousedown
      *   (but do so safely so that user can select text inside)
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmousedown: function (evt) {
         this.mousedown = true;
         OpenLayers.Event.stop(evt, true);
     },
 
-    /** 
+    /**
      * Method: onmousemove
-     * If the drag was started within the popup, then 
+     * If the drag was started within the popup, then
      *   do not propagate the mousemove (but do so safely
      *   so that user can select text inside)
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmousemove: function (evt) {
         if (this.mousedown) {
@@ -5485,15 +5485,15 @@
         }
     },
 
-    /** 
+    /**
      * Method: onmouseup
-     * When mouse comes up within the popup, after going down 
-     *   in it, reset the flag, and then (once again) do not 
-     *   propagate the event, but do so safely so that user can 
+     * When mouse comes up within the popup, after going down
+     *   in it, reset the flag, and then (once again) do not
+     *   propagate the event, but do so safely so that user can
      *   select text inside
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmouseup: function (evt) {
         if (this.mousedown) {
@@ -5505,32 +5505,32 @@
     /**
      * Method: onclick
      * Ignore clicks, but allowing default browser handling
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onclick: function (evt) {
         OpenLayers.Event.stop(evt, true);
     },
 
-    /** 
+    /**
      * Method: onmouseout
      * When mouse goes out of the popup set the flag to false so that
      *   if they let go and then drag back in, we won't be confused.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmouseout: function (evt) {
         this.mousedown = false;
     },
-    
-    /** 
+
+    /**
      * Method: ondblclick
      * Ignore double-clicks, but allowing default browser handling
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     ondblclick: function (evt) {
         OpenLayers.Event.stop(evt, true);
@@ -5558,13 +5558,13 @@
  *     one of the protocol subclasses instead.
  */
 OpenLayers.Protocol = OpenLayers.Class({
-    
+
     /**
      * Property: format
      * {<OpenLayers.Format>} The format used by this protocol.
      */
     format: null,
-    
+
     /**
      * Property: options
      * {Object} Any options sent to the constructor.
@@ -5578,7 +5578,7 @@
      *      true.
      */
     autoDestroy: true,
-   
+
     /**
      * Constructor: OpenLayers.Protocol
      * Abstract class for vector protocols.  Create instances of a subclass.
@@ -5601,7 +5601,7 @@
         this.options = null;
         this.format = null;
     },
-    
+
     /**
      * APIMethod: read
      * Construct a request for reading new features.
@@ -5616,8 +5616,8 @@
      */
     read: function() {
     },
-    
-    
+
+
     /**
      * APIMethod: create
      * Construct a request for writing newly created features.
@@ -5634,7 +5634,7 @@
      */
     create: function() {
     },
-    
+
     /**
      * APIMethod: update
      * Construct a request updating modified features.
@@ -5651,7 +5651,7 @@
      */
     update: function() {
     },
-    
+
     /**
      * APIMethod: delete
      * Construct a request deleting a removed feature.
@@ -5699,8 +5699,8 @@
      */
     abort: function(response) {
     },
-   
-    CLASS_NAME: "OpenLayers.Protocol" 
+
+    CLASS_NAME: "OpenLayers.Protocol"
 });
 
 /**
@@ -5784,37 +5784,37 @@
  * full text of the license. */
 
 /**
- * Class: OpenLayers.Renderer 
+ * Class: OpenLayers.Renderer
  * This is the base class for all renderers.
  *
  * This is based on a merger code written by Paul Spencer and Bertil Chapuis.
  * It is largely composed of virtual functions that are to be implemented
  * in technology-specific subclasses, but there is some generic code too.
- * 
+ *
  * The functions that *are* implemented here merely deal with the maintenance
- *  of the size and extent variables, as well as the cached 'resolution' 
- *  value. 
- * 
+ *  of the size and extent variables, as well as the cached 'resolution'
+ *  value.
+ *
  * A note to the user that all subclasses should use getResolution() instead
- *  of directly accessing this.resolution in order to correctly use the 
+ *  of directly accessing this.resolution in order to correctly use the
  *  cacheing system.
  *
  */
 OpenLayers.Renderer = OpenLayers.Class({
 
-    /** 
+    /**
      * Property: container
-     * {DOMElement} 
+     * {DOMElement}
      */
     container: null,
-    
+
     /**
      * Property: root
      * {DOMElement}
      */
     root: null,
 
-    /** 
+    /**
      * Property: extent
      * {<OpenLayers.Bounds>}
      */
@@ -5823,44 +5823,44 @@
     /**
      * Property: locked
      * {Boolean} If the renderer is currently in a state where many things
-     *     are changing, the 'locked' property is set to true. This means 
+     *     are changing, the 'locked' property is set to true. This means
      *     that renderers can expect at least one more drawFeature event to be
      *     called with the 'locked' property set to 'true': In some renderers,
      *     this might make sense to use as a 'only update local information'
-     *     flag. 
-     */  
+     *     flag.
+     */
     locked: false,
-    
-    /** 
+
+    /**
      * Property: size
-     * {<OpenLayers.Size>} 
+     * {<OpenLayers.Size>}
      */
     size: null,
-    
+
     /**
      * Property: resolution
      * {Float} cache of current map resolution
      */
     resolution: null,
-    
+
     /**
-     * Property: map  
+     * Property: map
      * {<OpenLayers.Map>} Reference to the map -- this is set in Vector's setMap()
      */
     map: null,
-    
+
     /**
-     * Constructor: OpenLayers.Renderer 
+     * Constructor: OpenLayers.Renderer
      *
      * Parameters:
-     * containerID - {<String>} 
+     * containerID - {<String>}
      * options - {Object} options for this renderer. See sublcasses for
      *     supported options.
      */
     initialize: function(containerID, options) {
         this.container = OpenLayers.Util.getElement(containerID);
     },
-    
+
     /**
      * APIMethod: destroy
      */
@@ -5875,20 +5875,20 @@
     /**
      * APIMethod: supported
      * This should be overridden by specific subclasses
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the renderer class
      */
     supported: function() {
         return false;
-    },    
-    
+    },
+
     /**
      * Method: setExtent
      * Set the visible part of the layer.
      *
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution) -- this way it will be re-computed when 
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution) -- this way it will be re-computed when
      * next it is needed.
      * We nullify the resolution cache (this.resolution) if resolutionChanged
      * is set to true - this way it will be re-computed on the next
@@ -5904,27 +5904,27 @@
             this.resolution = null;
         }
     },
-    
+
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
-     * 
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution) -- this way it will be re-computed when 
+     *
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution) -- this way it will be re-computed when
      * next it is needed.
      *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         this.size = size.clone();
         this.resolution = null;
     },
-    
-    /** 
+
+    /**
      * Method: getResolution
      * Uses cached copy of resolution if available to minimize computing
-     * 
+     *
      * Returns:
      * The current map's resolution
      */
@@ -5932,7 +5932,7 @@
         this.resolution = this.resolution || this.map.getResolution();
         return this.resolution;
     },
-    
+
     /**
      * Method: drawFeature
      * Draw the feature.  The optional style argument can be used
@@ -5940,9 +5940,9 @@
      * be called from layer.drawFeature().
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * feature - {<OpenLayers.Feature.Vector>}
      * style - {<Object>}
-     * 
+     *
      * Returns:
      * {Boolean} true if the feature has been drawn completely, false if not,
      *     undefined if the feature had no geometry
@@ -5969,26 +5969,26 @@
     },
 
 
-    /** 
+    /**
      * Method: drawGeometry
-     * 
+     *
      * Draw a geometry.  This should only be called from the renderer itself.
      * Use layer.drawFeature() from outside the renderer.
      * virtual function
      *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
-     * style - {Object} 
-     * featureId - {<String>} 
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     * featureId - {<String>}
      */
     drawGeometry: function(geometry, style, featureId) {},
-        
+
     /**
      * Method: drawText
      * Function for drawing text labels.
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
@@ -5999,40 +5999,40 @@
      * Method: removeText
      * Function for removing text labels.
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      */
     removeText: function(featureId) {},
-    
+
     /**
      * Method: clear
      * Clear all vectors from the renderer.
      * virtual function.
-     */    
+     */
     clear: function() {},
 
     /**
      * Method: getFeatureIdFromEvent
-     * Returns a feature id from an event on the renderer.  
+     * Returns a feature id from an event on the renderer.
      * How this happens is specific to the renderer.  This should be
      * called from layer.getFeatureFromEvent().
      * Virtual function.
-     * 
+     *
      * Parameters:
-     * evt - {<OpenLayers.Event>} 
+     * evt - {<OpenLayers.Event>}
      *
      * Returns:
      * {String} A feature id or null.
      */
     getFeatureIdFromEvent: function(evt) {},
-    
+
     /**
-     * Method: eraseFeatures 
+     * Method: eraseFeatures
      * This is called by the layer to erase features
-     * 
+     *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         if(!(features instanceof Array)) {
@@ -6043,23 +6043,23 @@
             this.removeText(features[i].id);
         }
     },
-    
+
     /**
      * Method: eraseGeometry
      * Remove a geometry from the renderer (by id).
      * virtual function.
-     * 
+     *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
+     * geometry - {<OpenLayers.Geometry>}
      */
     eraseGeometry: function(geometry) {},
-    
+
     /**
      * Method: moveRoot
      * moves this renderer's root to a (different) renderer.
      * To be implemented by subclasses that require a common renderer root for
      * feature selection.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      */
@@ -6070,7 +6070,7 @@
      * Gets the layer that this renderer's output appears on. If moveRoot was
      * used, this will be different from the id of the layer containing the
      * features rendered by this renderer.
-     * 
+     *
      * Returns:
      * {String} the id of the output layer.
      */
@@ -6094,21 +6094,21 @@
  *     one of the strategy subclasses instead.
  */
 OpenLayers.Strategy = OpenLayers.Class({
-    
+
     /**
      * Property: layer
      * {<OpenLayers.Layer.Vector>} The layer this strategy belongs to.
      */
     layer: null,
-    
+
     /**
      * Property: options
      * {Object} Any options sent to the constructor.
      */
     options: null,
 
-    /** 
-     * Property: active 
+    /**
+     * Property: active
      * {Boolean} The control is active.
      */
     active: null,
@@ -6143,7 +6143,7 @@
         // set the active property here, so that user cannot override it
         this.active = false;
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up the strategy.
@@ -6164,7 +6164,7 @@
     setLayer: function(layer) {
         this.layer = layer;
     },
-    
+
     /**
      * Method: activate
      * Activate the strategy.  Register any listeners, do appropriate setup.
@@ -6180,7 +6180,7 @@
         }
         return false;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivate the strategy.  Unregister any listeners, do appropriate
@@ -6197,8 +6197,8 @@
         }
         return false;
     },
-   
-    CLASS_NAME: "OpenLayers.Strategy" 
+
+    CLASS_NAME: "OpenLayers.Strategy"
 });
 /* ======================================================================
     OpenLayers/Control.js
@@ -6215,15 +6215,15 @@
 /**
  * Class: OpenLayers.Control
  * Controls affect the display or behavior of the map. They allow everything
- * from panning and zooming to displaying a scale indicator. Controls by 
+ * from panning and zooming to displaying a scale indicator. Controls by
  * default are added to the map they are contained within however it is
  * possible to add a control to an external div by passing the div in the
  * options parameter.
- * 
+ *
  * Example:
  * The following example shows how to add many of the common controls
  * to a map.
- * 
+ *
  * > var map = new OpenLayers.Map('map', { controls: [] });
  * >
  * > map.addControl(new OpenLayers.Control.PanZoomBar());
@@ -6235,10 +6235,10 @@
  * > map.addControl(new OpenLayers.Control.OverviewMap());
  * > map.addControl(new OpenLayers.Control.KeyboardDefaults());
  *
- * The next code fragment is a quick example of how to intercept 
+ * The next code fragment is a quick example of how to intercept
  * shift-mouse click to display the extent of the bounding box
  * dragged out by the user.  Usually controls are not created
- * in exactly this manner.  See the source for a more complete 
+ * in exactly this manner.  See the source for a more complete
  * example:
  *
  * > var control = new OpenLayers.Control();
@@ -6246,7 +6246,7 @@
  * >     draw: function () {
  * >         // this Handler.Box will intercept the shift-mousedown
  * >         // before Control.MouseDefault gets to see it
- * >         this.box = new OpenLayers.Handler.Box( control, 
+ * >         this.box = new OpenLayers.Handler.Box( control,
  * >             {"done": this.notice},
  * >             {keyMask: OpenLayers.Handler.MOD_SHIFT});
  * >         this.box.activate();
@@ -6255,70 +6255,70 @@
  * >     notice: function (bounds) {
  * >         OpenLayers.Console.userError(bounds);
  * >     }
- * > }); 
+ * > });
  * > map.addControl(control);
- * 
+ *
  */
 OpenLayers.Control = OpenLayers.Class({
 
-    /** 
-     * Property: id 
-     * {String} 
+    /**
+     * Property: id
+     * {String}
      */
     id: null,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} this gets set in the addControl() function in
-     * OpenLayers.Map 
+     * OpenLayers.Map
      */
     map: null,
 
-    /** 
-     * Property: div 
-     * {DOMElement} 
+    /**
+     * Property: div
+     * {DOMElement}
      */
     div: null,
 
-    /** 
-     * Property: type 
+    /**
+     * Property: type
      * {OpenLayers.Control.TYPES} Controls can have a 'type'. The type
      * determines the type of interactions which are possible with them when
-     * they are placed into a toolbar. 
+     * they are placed into a toolbar.
      */
-    type: null, 
+    type: null,
 
-    /** 
+    /**
      * Property: allowSelection
      * {Boolean} By deafault, controls do not allow selection, because
      * it may interfere with map dragging. If this is true, OpenLayers
      * will not prevent selection of the control.
      * Default is false.
      */
-    allowSelection: false,  
+    allowSelection: false,
 
-    /** 
-     * Property: displayClass 
+    /**
+     * Property: displayClass
      * {string}  This property is used for CSS related to the drawing of the
-     * Control. 
+     * Control.
      */
     displayClass: "",
-    
+
     /**
-    * Property: title  
-    * {string}  This property is used for showing a tooltip over the  
-    * Control.  
-    */ 
+    * Property: title
+    * {string}  This property is used for showing a tooltip over the
+    * Control.
+    */
     title: "",
 
-    /** 
-     * Property: active 
+    /**
+     * Property: active
      * {Boolean} The control is active.
      */
     active: null,
 
-    /** 
-     * Property: handler 
+    /**
+     * Property: handler
      * {<OpenLayers.Handler>} null
      */
     handler: null,
@@ -6332,7 +6332,7 @@
      */
     eventListeners: null,
 
-    /** 
+    /**
      * Property: events
      * {<OpenLayers.Events>} Events instance for triggering control specific
      *     events.
@@ -6366,22 +6366,22 @@
      * Constructor: OpenLayers.Control
      * Create an OpenLayers Control.  The options passed as a parameter
      * directly extend the control.  For example passing the following:
-     * 
+     *
      * > var control = new OpenLayers.Control({div: myDiv});
      *
      * Overrides the default div attribute value of null.
-     * 
+     *
      * Parameters:
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function (options) {
         // We do this before the extend so that instances can override
         // className in options.
-        this.displayClass = 
+        this.displayClass =
             this.CLASS_NAME.replace("OpenLayers.", "ol").replace(/\./g, "");
-        
+
         OpenLayers.Util.extend(this, options);
-        
+
         this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES);
         if(this.eventListeners instanceof Object) {
             this.events.on(this.eventListeners);
@@ -6427,14 +6427,14 @@
         }
     },
 
-    /** 
+    /**
      * Method: setMap
      * Set the map property for the control. This is done through an accessor
-     * so that subclasses can override this and take special action once 
-     * they have their map variable set. 
+     * so that subclasses can override this and take special action once
+     * they have their map variable set.
      *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         this.map = map;
@@ -6442,13 +6442,13 @@
             this.handler.setMap(map);
         }
     },
-  
+
     /**
      * Method: draw
      * The draw method is called when the control is ready to be displayed
      * on the page.  If a div has not been created one is created.  Controls
-     * with a visual component will almost always want to override this method 
-     * to customize the look of control. 
+     * with a visual component will almost always want to override this method
+     * to customize the look of control.
      *
      * Parameters:
      * px - {<OpenLayers.Pixel>} The top-left pixel position of the control
@@ -6464,8 +6464,8 @@
             if (!this.allowSelection) {
                 this.div.className += " olControlNoSelect";
                 this.div.setAttribute("unselectable", "on", 0);
-                this.div.onselectstart = function() { return(false); }; 
-            }    
+                this.div.onselectstart = function() { return(false); };
+            }
             if (this.title != "") {
                 this.div.title = this.title;
             }
@@ -6479,7 +6479,7 @@
 
     /**
      * Method: moveTo
-     * Sets the left and top style attributes to the passed in pixel 
+     * Sets the left and top style attributes to the passed in pixel
      * coordinates.
      *
      * Parameters:
@@ -6497,7 +6497,7 @@
      * Explicitly activates a control and it's associated
      * handler if one has been set.  Controls can be
      * deactivated by calling the deactivate() method.
-     * 
+     *
      * Returns:
      * {Boolean}  True if the control was successfully activated or
      *            false if the control was already active.
@@ -6519,12 +6519,12 @@
         this.events.triggerEvent("activate");
         return true;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivates a control and it's associated handler if any.  The exact
      * effect of this depends on the control itself.
-     * 
+     *
      * Returns:
      * {Boolean} True if the control was effectively deactivated or false
      *           if the control was already inactive.
@@ -6571,8 +6571,8 @@
  *     and methods to set and get the current language.
  */
 OpenLayers.Lang = {
-    
-    /** 
+
+    /**
      * Property: code
      * {String}  Current language code to use in OpenLayers.  Use the
      *     <setCode> method to set this value and the <getCode> method to
@@ -6580,13 +6580,13 @@
      */
     code: null,
 
-    /** 
+    /**
      * APIProperty: defaultCode
      * {String} Default language to use when a specific language can't be
      *     found.  Default is "en".
      */
     defaultCode: "en",
-        
+
     /**
      * APIFunction: getCode
      * Get the current language code.
@@ -6600,7 +6600,7 @@
         }
         return OpenLayers.Lang.code;
     },
-    
+
     /**
      * APIFunction: setCode
      * Set the language code for string translation.  This code is used by
@@ -6639,7 +6639,7 @@
             );
             lang = OpenLayers.Lang.defaultCode;
         }
-        
+
         OpenLayers.Lang.code = lang;
     },
 
@@ -6653,7 +6653,7 @@
      * key - {String} The key for an i18n string value in the dictionary.
      * context - {Object} Optional context to be used with
      *     <OpenLayers.String.format>.
-     * 
+     *
      * Returns:
      * {String} A internationalized string.
      */
@@ -6669,7 +6669,7 @@
         }
         return message;
     }
-    
+
 };
 
 
@@ -6684,7 +6684,7 @@
  * key - {String} The key for an i18n string value in the dictionary.
  * context - {Object} Optional context to be used with
  *     <OpenLayers.String.format>.
- * 
+ *
  * Returns:
  * {String} A internationalized string.
  */
@@ -6704,28 +6704,28 @@
 
 /**
  * Class: OpenLayers.Popup.Anchored
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Popup>
  */
-OpenLayers.Popup.Anchored = 
+OpenLayers.Popup.Anchored =
   OpenLayers.Class(OpenLayers.Popup, {
 
-    /** 
+    /**
      * Parameter: relativePosition
      * {String} Relative position of the popup ("br", "tr", "tl" or "bl").
      */
     relativePosition: null,
-    
+
     /**
-     * APIProperty: keepInMap 
-     * {Boolean} If panMapIfOutOfView is false, and this property is true, 
+     * APIProperty: keepInMap
+     * {Boolean} If panMapIfOutOfView is false, and this property is true,
      *     contrain the popup such that it always fits in the available map
      *     space. By default, this is set. If you are creating popups that are
      *     near map edges and not allowing pannning, and especially if you have
      *     a popup which has a fixedRelativePosition, setting this to false may
      *     be a smart thing to do.
-     *   
+     *
      *     For anchored popups, default is true, since subclasses will
      *     usually want this functionality.
      */
@@ -6733,20 +6733,20 @@
 
     /**
      * Parameter: anchor
-     * {Object} Object to which we'll anchor the popup. Must expose a 
+     * {Object} Object to which we'll anchor the popup. Must expose a
      *     'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>).
      */
     anchor: null,
 
-    /** 
+    /**
     * Constructor: OpenLayers.Popup.Anchored
-    * 
+    *
     * Parameters:
     * id - {String}
     * lonlat - {<OpenLayers.LonLat>}
     * contentSize - {<OpenLayers.Size>}
     * contentHTML - {String}
-    * anchor - {Object} Object which must expose a 'size' <OpenLayers.Size> 
+    * anchor - {Object} Object which must expose a 'size' <OpenLayers.Size>
     *     and 'offset' <OpenLayers.Pixel> (generally an <OpenLayers.Icon>).
     * closeBox - {Boolean}
     * closeBoxCallback - {Function} Function to be called on closeBox click.
@@ -6758,7 +6758,7 @@
         ];
         OpenLayers.Popup.prototype.initialize.apply(this, newArguments);
 
-        this.anchor = (anchor != null) ? anchor 
+        this.anchor = (anchor != null) ? anchor
                                        : { size: new OpenLayers.Size(0,0),
                                            offset: new OpenLayers.Pixel(0,0)};
     },
@@ -6769,13 +6769,13 @@
     destroy: function() {
         this.anchor = null;
         this.relativePosition = null;
-        
-        OpenLayers.Popup.prototype.destroy.apply(this, arguments);        
+
+        OpenLayers.Popup.prototype.destroy.apply(this, arguments);
     },
 
     /**
      * APIMethod: show
-     * Overridden from Popup since user might hide popup and then show() it 
+     * Overridden from Popup since user might hide popup and then show() it
      *     in a new location (meaning we might want to update the relative
      *     position on the show)
      */
@@ -6787,27 +6787,27 @@
     /**
      * Method: moveTo
      * Since the popup is moving to a new px, it might need also to be moved
-     *     relative to where the marker is. We first calculate the new 
-     *     relativePosition, and then we calculate the new px where we will 
-     *     put the popup, based on the new relative position. 
-     * 
-     *     If the relativePosition has changed, we must also call 
-     *     updateRelativePosition() to make any visual changes to the popup 
+     *     relative to where the marker is. We first calculate the new
+     *     relativePosition, and then we calculate the new px where we will
+     *     put the popup, based on the new relative position.
+     *
+     *     If the relativePosition has changed, we must also call
+     *     updateRelativePosition() to make any visual changes to the popup
      *     which are associated with putting it in a new relativePosition.
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      */
     moveTo: function(px) {
         var oldRelativePosition = this.relativePosition;
         this.relativePosition = this.calculateRelativePosition(px);
-        
+
         var newPx = this.calculateNewPx(px);
-        
-        var newArguments = new Array(newPx);        
+
+        var newArguments = new Array(newPx);
         OpenLayers.Popup.prototype.moveTo.apply(this, newArguments);
-        
-        //if this move has caused the popup to change its relative position, 
+
+        //if this move has caused the popup to change its relative position,
         // we need to make the appropriate cosmetic changes.
         if (this.relativePosition != oldRelativePosition) {
             this.updateRelativePosition();
@@ -6816,76 +6816,76 @@
 
     /**
      * APIMethod: setSize
-     * 
+     *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
+    setSize:function(contentSize) {
         OpenLayers.Popup.prototype.setSize.apply(this, arguments);
 
         if ((this.lonlat) && (this.map)) {
             var px = this.map.getLayerPxFromLonLat(this.lonlat);
             this.moveTo(px);
         }
-    },  
-    
-    /** 
+    },
+
+    /**
      * Method: calculateRelativePosition
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {String} The relative position ("br" "tr" "tl" "bl") at which the popup
      *     should be placed.
      */
     calculateRelativePosition:function(px) {
-        var lonlat = this.map.getLonLatFromLayerPx(px);        
-        
+        var lonlat = this.map.getLonLatFromLayerPx(px);
+
         var extent = this.map.getExtent();
         var quadrant = extent.determineQuadrant(lonlat);
-        
+
         return OpenLayers.Bounds.oppositeQuadrant(quadrant);
-    }, 
+    },
 
     /**
      * Method: updateRelativePosition
-     * The popup has been moved to a new relative location, so we may want to 
-     *     make some cosmetic adjustments to it. 
-     * 
-     *     Note that in the classic Anchored popup, there is nothing to do 
+     * The popup has been moved to a new relative location, so we may want to
+     *     make some cosmetic adjustments to it.
+     *
+     *     Note that in the classic Anchored popup, there is nothing to do
      *     here, since the popup looks exactly the same in all four positions.
-     *     Subclasses such as the AnchoredBubble and Framed, however, will 
+     *     Subclasses such as the AnchoredBubble and Framed, however, will
      *     want to do something special here.
      */
     updateRelativePosition: function() {
         //to be overridden by subclasses
     },
 
-    /** 
+    /**
      * Method: calculateNewPx
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The the new px position of the popup on the screen
      *     relative to the passed-in px.
      */
     calculateNewPx:function(px) {
         var newPx = px.offset(this.anchor.offset);
-        
+
         //use contentSize if size is not already set
         var size = this.size || this.contentSize;
 
         var top = (this.relativePosition.charAt(0) == 't');
         newPx.y += (top) ? -size.h : this.anchor.size.h;
-        
+
         var left = (this.relativePosition.charAt(1) == 'l');
         newPx.x += (left) ? -size.w : this.anchor.size.w;
 
-        return newPx;   
+        return newPx;
     },
 
     CLASS_NAME: "OpenLayers.Popup.Anchored"
@@ -6903,9 +6903,9 @@
  */
 
 /**
- * Class: OpenLayers.Renderer.Canvas 
+ * Class: OpenLayers.Renderer.Canvas
  * A renderer based on the 2D 'canvas' drawing element.element
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Renderer>
  */
@@ -6915,14 +6915,14 @@
      * Property: canvas
      * {Canvas} The canvas context object.
      */
-    canvas: null, 
-    
+    canvas: null,
+
     /**
      * Property: features
      * {Object} Internal object of feature/style pairs for use in redrawing the layer.
      */
-    features: null, 
-   
+    features: null,
+
     /**
      * Property: geometryMap
      * {Object} Geometry -> Feature lookup table. Used by eraseGeometry to
@@ -6930,12 +6930,12 @@
      *     when erasing geoms.
      */
     geometryMap: null,
- 
+
     /**
      * Constructor: OpenLayers.Renderer.Canvas
      *
      * Parameters:
-     * containerID - {<String>} 
+     * containerID - {<String>}
      */
     initialize: function(containerID) {
         OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
@@ -6945,13 +6945,13 @@
         this.features = {};
         this.geometryMap = {};
     },
-    
-    /** 
+
+    /**
      * Method: eraseGeometry
      * Erase a geometry from the renderer. Because the Canvas renderer has
      *     'memory' of the features that it has drawn, we have to remove the
-     *     feature so it doesn't redraw.   
-     * 
+     *     feature so it doesn't redraw.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      */
@@ -6961,31 +6961,31 @@
 
     /**
      * APIMethod: supported
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the renderer class
      */
     supported: function() {
         var canvas = document.createElement("canvas");
         return !!canvas.getContext;
-    },    
-    
+    },
+
     /**
      * Method: setExtent
      * Set the visible part of the layer.
      *
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution), then redraw. 
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution), then redraw.
      *
      * Parameters:
-     * extent - {<OpenLayers.Bounds>} 
+     * extent - {<OpenLayers.Bounds>}
      */
     setExtent: function(extent) {
         this.extent = extent.clone();
         this.resolution = null;
         this.redraw();
     },
-    
+
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
@@ -6993,7 +6993,7 @@
      * Once the size is updated, redraw the canvas.
      *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         this.size = size.clone();
@@ -7003,15 +7003,15 @@
         this.root.height = size.h;
         this.resolution = null;
     },
-    
+
     /**
      * Method: drawFeature
      * Draw the feature. Stores the feature in the features list,
-     * then redraws the layer. 
+     * then redraws the layer.
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
-     * style - {<Object>} 
+     * feature - {<OpenLayers.Feature.Vector>}
+     * style - {<Object>}
      */
     drawFeature: function(feature, style) {
         if(style == null) {
@@ -7023,23 +7023,23 @@
           'strokeWidth': 2,
           'fillOpacity': 1,
           'strokeOpacity': 1
-        }, style);  
-        this.features[feature.id] = [feature, style]; 
-        if (feature.geometry) { 
+        }, style);
+        this.features[feature.id] = [feature, style];
+        if (feature.geometry) {
             this.geometryMap[feature.geometry.id] = feature.id;
-        }    
+        }
         this.redraw();
     },
 
 
-    /** 
+    /**
      * Method: drawGeometry
      * Used when looping (in redraw) over the features; draws
-     * the canvas. 
+     * the canvas.
      *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
-     * style - {Object} 
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
      */
     drawGeometry: function(geometry, style) {
         var className = geometry.CLASS_NAME;
@@ -7072,18 +7072,18 @@
 
     /**
      * Method: drawExternalGraphic
-     * Called to draw External graphics. 
-     * 
-     * Parameters: 
+     * Called to draw External graphics.
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawExternalGraphic: function(pt, style) {
        var img = new Image();
        img.src = style.externalGraphic;
-       
+
        if(style.graphicTitle) {
-           img.title=style.graphicTitle;           
+           img.title=style.graphicTitle;
        }
 
        var width = style.graphicWidth || style.graphicHeight;
@@ -7095,18 +7095,18 @@
        var yOffset = (style.graphicYOffset != undefined) ?
            style.graphicYOffset : -(0.5 * height);
        var opacity = style.graphicOpacity || style.fillOpacity;
-       
-       var context = { img: img, 
-                       x: (pt[0]+xOffset), 
-                       y: (pt[1]+yOffset), 
-                       width: width, 
-                       height: height, 
+
+       var context = { img: img,
+                       x: (pt[0]+xOffset),
+                       y: (pt[1]+yOffset),
+                       width: width,
+                       height: height,
                        canvas: this.canvas };
 
        img.onload = OpenLayers.Function.bind( function() {
-           this.canvas.drawImage(this.img, this.x, 
+           this.canvas.drawImage(this.img, this.x,
                                  this.y, this.width, this.height);
-       }, context);   
+       }, context);
     },
 
     /**
@@ -7118,10 +7118,10 @@
      * style - {Object} Symbolizer hash
      */
     setCanvasStyle: function(type, style) {
-        if (type == "fill") {     
+        if (type == "fill") {
             this.canvas.globalAlpha = style['fillOpacity'];
             this.canvas.fillStyle = style['fillColor'];
-        } else if (type == "stroke") {  
+        } else if (type == "stroke") {
             this.canvas.globalAlpha = style['strokeOpacity'];
             this.canvas.strokeStyle = style['strokeColor'];
             this.canvas.lineWidth = style['strokeWidth'];
@@ -7134,15 +7134,15 @@
     /**
      * Method: drawPoint
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawPoint: function(geometry, style) {
         if(style.graphic !== false) {
             var pt = this.getLocalXY(geometry);
-            
+
             if (style.externalGraphic) {
                 this.drawExternalGraphic(pt, style);
             } else {
@@ -7152,7 +7152,7 @@
                     this.canvas.arc(pt[0], pt[1], 6, 0, Math.PI*2, true);
                     this.canvas.fill();
                 }
-                
+
                 if(style.stroke !== false) {
                     this.setCanvasStyle("stroke", style);
                     this.canvas.beginPath();
@@ -7167,11 +7167,11 @@
     /**
      * Method: drawLineString
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawLineString: function(geometry, style) {
         if(style.stroke !== false) {
             this.setCanvasStyle("stroke", style);
@@ -7185,16 +7185,16 @@
             this.canvas.stroke();
         }
         this.setCanvasStyle("reset");
-    },    
-    
+    },
+
     /**
      * Method: drawLinearRing
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawLinearRing: function(geometry, style) {
         if(style.fill !== false) {
             this.setCanvasStyle("fill", style);
@@ -7207,9 +7207,9 @@
             }
             this.canvas.fill();
         }
-        
+
         if(style.stroke !== false) {
-            var oldWidth = this.canvas.lineWidth; 
+            var oldWidth = this.canvas.lineWidth;
             this.setCanvasStyle("stroke", style);
             this.canvas.beginPath();
             var start = this.getLocalXY(geometry.components[0]);
@@ -7221,29 +7221,29 @@
             this.canvas.stroke();
         }
         this.setCanvasStyle("reset");
-    },    
-    
+    },
+
     /**
      * Method: drawPolygon
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawPolygon: function(geometry, style) {
         this.drawLinearRing(geometry.components[0], style);
         for (var i = 1; i < geometry.components.length; i++) {
             this.drawLinearRing(geometry.components[i], {
-                fillOpacity: 0, 
-                strokeWidth: 0, 
-                strokeOpacity: 0, 
-                strokeColor: '#000000', 
+                fillOpacity: 0,
+                strokeWidth: 0,
+                strokeOpacity: 0,
+                strokeColor: '#000000',
                 fillColor: '#000000'}
-            ); // inner rings are 'empty'  
+            ); // inner rings are 'empty'
         }
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
@@ -7258,7 +7258,7 @@
             labelAlign: "cm"
         }, style);
         var pt = this.getLocalXY(location);
-        
+
         this.setCanvasStyle("reset");
         this.canvas.fillStyle = style.fontColor;
         this.canvas.globalAlpha = 1;
@@ -7287,7 +7287,7 @@
                     pt[0] -= len / 2;
             }
             this.canvas.translate(pt[0], pt[1]);
-            
+
             this.canvas.mozDrawText(style.label);
             this.canvas.translate(-1*pt[0], -1*pt[1]);
         }
@@ -7298,7 +7298,7 @@
      * Method: getLocalXY
      * transform geographic xy into pixel xy
      *
-     * Parameters: 
+     * Parameters:
      * point - {<OpenLayers.Geometry.Point>}
      */
     getLocalXY: function(point) {
@@ -7308,22 +7308,22 @@
         var y = ((extent.top / resolution) - point.y / resolution);
         return [x, y];
     },
-        
+
     /**
      * Method: clear
      * Clear all vectors from the renderer.
      * virtual function.
-     */    
+     */
     clear: function() {
         this.canvas.clearRect(0, 0, this.root.width, this.root.height);
     },
 
     /**
      * Method: getFeatureIdFromEvent
-     * Returns a feature id from an event on the renderer.  
-     * 
+     * Returns a feature id from an event on the renderer.
+     *
      * Parameters:
-     * evt - {<OpenLayers.Event>} 
+     * evt - {<OpenLayers.Event>}
      *
      * Returns:
      * {String} A feature id or null.
@@ -7331,9 +7331,9 @@
     getFeatureIdFromEvent: function(evt) {
         var loc = this.map.getLonLatFromPixel(evt.xy);
         var resolution = this.getResolution();
-        var bounds = new OpenLayers.Bounds(loc.lon - resolution * 5, 
-                                           loc.lat - resolution * 5, 
-                                           loc.lon + resolution * 5, 
+        var bounds = new OpenLayers.Bounds(loc.lon - resolution * 5,
+                                           loc.lat - resolution * 5,
+                                           loc.lon + resolution * 5,
                                            loc.lat + resolution * 5);
         var geom = bounds.toGeometry();
         for (var feat in this.features) {
@@ -7341,17 +7341,17 @@
             if (this.features[feat][0].geometry.intersects(geom)) {
                 return feat;
             }
-        }   
+        }
         return null;
     },
-    
+
     /**
-     * Method: eraseFeatures 
+     * Method: eraseFeatures
      * This is called by the layer to erase features; removes the feature from
      *     the list, then redraws the layer.
-     * 
+     *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         if(!(features instanceof Array)) {
@@ -7391,7 +7391,7 @@
                 item = labelMap[i];
                 this.drawText(item[0].geometry.getCentroid(), item[1]);
             }
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Renderer.Canvas"
@@ -7420,33 +7420,33 @@
 /**
  * Class: OpenLayers.ElementsIndexer
  * This class takes care of figuring out which order elements should be
- *     placed in the DOM based on given indexing methods. 
+ *     placed in the DOM based on given indexing methods.
  */
 OpenLayers.ElementsIndexer = OpenLayers.Class({
-   
+
     /**
      * Property: maxZIndex
      * {Integer} This is the largest-most z-index value for a node
      *     contained within the indexer.
      */
     maxZIndex: null,
-    
+
     /**
      * Property: order
      * {Array<String>} This is an array of node id's stored in the
      *     order that they should show up on screen. Id's higher up in the
      *     array (higher array index) represent nodes with higher z-indeces.
      */
-    order: null, 
-    
+    order: null,
+
     /**
      * Property: indices
      * {Object} This is a hash that maps node ids to their z-index value
-     *     stored in the indexer. This is done to make finding a nodes z-index 
+     *     stored in the indexer. This is done to make finding a nodes z-index
      *     value O(1).
      */
     indices: null,
-    
+
     /**
      * Property: compare
      * {Function} This is the function used to determine placement of
@@ -7454,34 +7454,34 @@
      *     the Z_ORDER_DRAWING_ORDER comparison method.
      */
     compare: null,
-    
+
     /**
      * APIMethod: initialize
-     * Create a new indexer with 
-     * 
+     * Create a new indexer with
+     *
      * Parameters:
      * yOrdering - {Boolean} Whether to use y-ordering.
      */
     initialize: function(yOrdering) {
 
-        this.compare = yOrdering ? 
+        this.compare = yOrdering ?
             OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER :
             OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;
-            
+
         this.order = [];
         this.indices = {};
         this.maxZIndex = 0;
     },
-    
+
     /**
      * APIMethod: insert
-     * Insert a new node into the indexer. In order to find the correct 
-     *     positioning for the node to be inserted, this method uses a binary 
-     *     search. This makes inserting O(log(n)). 
-     * 
+     * Insert a new node into the indexer. In order to find the correct
+     *     positioning for the node to be inserted, this method uses a binary
+     *     search. This makes inserting O(log(n)).
+     *
      * Parameters:
      * newNode - {DOMElement} The new node to be inserted.
-     * 
+     *
      * Returns
      * {DOMElement} the node before which we should insert our newNode, or
      *     null if newNode can just be appended.
@@ -7492,40 +7492,40 @@
         if (this.exists(newNode)) {
             this.remove(newNode);
         }
-        
+
         var nodeId = newNode.id;
-        
-        this.determineZIndex(newNode);       
 
+        this.determineZIndex(newNode);
+
         var leftIndex = -1;
         var rightIndex = this.order.length;
         var middle;
 
         while (rightIndex - leftIndex > 1) {
             middle = parseInt((leftIndex + rightIndex) / 2);
-            
+
             var placement = this.compare(this, newNode,
                 OpenLayers.Util.getElement(this.order[middle]));
-            
+
             if (placement > 0) {
                 leftIndex = middle;
             } else {
                 rightIndex = middle;
-            } 
+            }
         }
-        
+
         this.order.splice(rightIndex, 0, nodeId);
         this.indices[nodeId] = this.getZIndex(newNode);
-        
+
         // If the new node should be before another in the index
         // order, return the node before which we have to insert the new one;
         // else, return null to indicate that the new node can be appended.
-	return this.getNextElement(rightIndex);
+    return this.getNextElement(rightIndex);
     },
-    
+
     /**
      * APIMethod: remove
-     * 
+     *
      * Parameters:
      * node - {DOMElement} The node to be removed.
      */
@@ -7537,8 +7537,8 @@
             // from the indeces hash.
             this.order.splice(arrayIndex, 1);
             delete this.indices[nodeId];
-            
-            // Reset the maxium z-index based on the last item in the 
+
+            // Reset the maxium z-index based on the last item in the
             // order array.
             if (this.order.length > 0) {
                 var lastId = this.order[this.order.length - 1];
@@ -7548,7 +7548,7 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: clear
      */
@@ -7557,7 +7557,7 @@
         this.indices = {};
         this.maxZIndex = 0;
     },
-    
+
     /**
      * APIMethod: exists
      *
@@ -7574,29 +7574,29 @@
     /**
      * APIMethod: getZIndex
      * Get the z-index value for the current node from the node data itself.
-     * 
+     *
      * Parameters:
      * node - {DOMElement} The node whose z-index to get.
-     * 
+     *
      * Returns:
-     * {Integer} The z-index value for the specified node (from the node 
+     * {Integer} The z-index value for the specified node (from the node
      *     data itself).
      */
     getZIndex: function(node) {
-        return node._style.graphicZIndex;  
+        return node._style.graphicZIndex;
     },
-    
+
     /**
      * Method: determineZIndex
-     * Determine the z-index for the current node if there isn't one, 
+     * Determine the z-index for the current node if there isn't one,
      *     and set the maximum value if we've found a new maximum.
-     * 
+     *
      * Parameters:
-     * node - {DOMElement} 
+     * node - {DOMElement}
      */
     determineZIndex: function(node) {
         var zIndex = node._style.graphicZIndex;
-        
+
         // Everything must have a zIndex. If none is specified,
         // this means the user *must* (hint: assumption) want this
         // node to succomb to drawing order. To enforce drawing order
@@ -7604,59 +7604,59 @@
         // greater than any currently in the indexer.
         if (zIndex == null) {
             zIndex = this.maxZIndex;
-            node._style.graphicZIndex = zIndex; 
+            node._style.graphicZIndex = zIndex;
         } else if (zIndex > this.maxZIndex) {
             this.maxZIndex = zIndex;
         }
     },
-	
+
     /**
      * APIMethod: getNextElement
      * Get the next element in the order stack.
-     * 
+     *
      * Parameters:
      * index - {Integer} The index of the current node in this.order.
-     * 
+     *
      * Returns:
      * {DOMElement} the node following the index passed in, or
      *     null.
      */
     getNextElement: function(index) {
-		var nextIndex = index + 1;
+        var nextIndex = index + 1;
         if (nextIndex < this.order.length){
-			var nextElement = OpenLayers.Util.getElement(this.order[nextIndex]);
-			if (nextElement == undefined){
-			  nextElement = this.getNextElement(nextIndex);
-			}
-			return nextElement;
-		} else {
-			return null;
-		} 
-    },	
-    
+            var nextElement = OpenLayers.Util.getElement(this.order[nextIndex]);
+            if (nextElement == undefined){
+              nextElement = this.getNextElement(nextIndex);
+            }
+            return nextElement;
+        } else {
+            return null;
+        }
+    },
+
     CLASS_NAME: "OpenLayers.ElementsIndexer"
 });
 
 /**
  * Namespace: OpenLayers.ElementsIndexer.IndexingMethods
- * These are the compare methods for figuring out where a new node should be 
- *     placed within the indexer. These methods are very similar to general 
- *     sorting methods in that they return -1, 0, and 1 to specify the 
+ * These are the compare methods for figuring out where a new node should be
+ *     placed within the indexer. These methods are very similar to general
+ *     sorting methods in that they return -1, 0, and 1 to specify the
  *     direction in which new nodes fall in the ordering.
  */
 OpenLayers.ElementsIndexer.IndexingMethods = {
-    
+
     /**
      * Method: Z_ORDER
      * This compare method is used by other comparison methods.
      *     It can be used individually for ordering, but is not recommended,
      *     because it doesn't subscribe to drawing order.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
@@ -7666,93 +7666,93 @@
         var returnVal = 0;
         if (nextNode) {
             var nextZIndex = indexer.getZIndex(nextNode);
-            returnVal = newZIndex - nextZIndex; 
+            returnVal = newZIndex - nextZIndex;
         }
-        
+
         return returnVal;
     },
 
     /**
      * APIMethod: Z_ORDER_DRAWING_ORDER
      * This method orders nodes by their z-index, but does so in a way
-     *     that, if there are other nodes with the same z-index, the newest 
-     *     drawn will be the front most within that z-index. This is the 
+     *     that, if there are other nodes with the same z-index, the newest
+     *     drawn will be the front most within that z-index. This is the
      *     default indexing method.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
     Z_ORDER_DRAWING_ORDER: function(indexer, newNode, nextNode) {
         var returnVal = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(
-            indexer, 
-            newNode, 
+            indexer,
+            newNode,
             nextNode
         );
-        
+
         // Make Z_ORDER subscribe to drawing order by pushing it above
         // all of the other nodes with the same z-index.
         if (nextNode && returnVal == 0) {
             returnVal = 1;
         }
-        
+
         return returnVal;
     },
 
     /**
      * APIMethod: Z_ORDER_Y_ORDER
      * This one should really be called Z_ORDER_Y_ORDER_DRAWING_ORDER, as it
-     *     best describes which ordering methods have precedence (though, the 
-     *     name would be too long). This method orders nodes by their z-index, 
-     *     but does so in a way that, if there are other nodes with the same 
-     *     z-index, the nodes with the lower y position will be "closer" than 
-     *     those with a higher y position. If two nodes have the exact same y 
-     *     position, however, then this method will revert to using drawing  
+     *     best describes which ordering methods have precedence (though, the
+     *     name would be too long). This method orders nodes by their z-index,
+     *     but does so in a way that, if there are other nodes with the same
+     *     z-index, the nodes with the lower y position will be "closer" than
+     *     those with a higher y position. If two nodes have the exact same y
+     *     position, however, then this method will revert to using drawing
      *     order to decide placement.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
     Z_ORDER_Y_ORDER: function(indexer, newNode, nextNode) {
         var returnVal = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(
-            indexer, 
-            newNode, 
+            indexer,
+            newNode,
             nextNode
         );
-        
+
         if (nextNode && returnVal == 0) {
             var newLat = newNode._geometry.getBounds().bottom;
             var nextLat = nextNode._geometry.getBounds().bottom;
-            
+
             var result = nextLat - newLat;
             returnVal = (result ==0) ? 1 : result;
         }
-        
-        return returnVal;       
+
+        return returnVal;
     }
 };
 
 /**
  * Class: OpenLayers.Renderer.Elements
- * This is another virtual class in that it should never be instantiated by 
- *  itself as a Renderer. It exists because there is *tons* of shared 
+ * This is another virtual class in that it should never be instantiated by
+ *  itself as a Renderer. It exists because there is *tons* of shared
  *  functionality between different vector libraries which use nodes/elements
- *  as a base for rendering vectors. 
- * 
- * The highlevel bits of code that are implemented here are the adding and 
- *  removing of geometries, which is essentially the same for any 
+ *  as a base for rendering vectors.
+ *
+ * The highlevel bits of code that are implemented here are the adding and
+ *  removing of geometries, which is essentially the same for any
  *  element-based renderer. The details of creating each node and drawing the
- *  paths are of course different, but the machinery is the same. 
- * 
+ *  paths are of course different, but the machinery is the same.
+ *
  * Inherits:
  *  - <OpenLayers.Renderer>
  */
@@ -7763,13 +7763,13 @@
      * {DOMElement}
      */
     rendererRoot: null,
-    
+
     /**
      * Property: root
      * {DOMElement}
      */
     root: null,
-    
+
     /**
      * Property: vectorRoot
      * {DOMElement}
@@ -7785,29 +7785,29 @@
     /**
      * Property: xmlns
      * {String}
-     */    
+     */
     xmlns: null,
-    
+
     /**
      * Property: Indexer
-     * {<OpenLayers.ElementIndexer>} An instance of OpenLayers.ElementsIndexer 
+     * {<OpenLayers.ElementIndexer>} An instance of OpenLayers.ElementsIndexer
      *     created upon initialization if the zIndexing or yOrdering options
      *     passed to this renderer's constructor are set to true.
      */
-    indexer: null, 
-    
+    indexer: null,
+
     /**
      * Constant: BACKGROUND_ID_SUFFIX
      * {String}
      */
     BACKGROUND_ID_SUFFIX: "_background",
-    
+
     /**
      * Constant: BACKGROUND_ID_SUFFIX
      * {String}
      */
     LABEL_ID_SUFFIX: "_label",
-    
+
     /**
      * Property: minimumSymbolizer
      * {Object}
@@ -7819,10 +7819,10 @@
         fillOpacity: 1,
         pointRadius: 0
     },
-    
+
     /**
      * Constructor: OpenLayers.Renderer.Elements
-     * 
+     *
      * Parameters:
      * containerID - {String}
      * options - {Object} options for this renderer. Supported options are:
@@ -7837,24 +7837,24 @@
         this.root = this.createRoot("_root");
         this.vectorRoot = this.createRoot("_vroot");
         this.textRoot = this.createRoot("_troot");
-        
+
         this.root.appendChild(this.vectorRoot);
         this.root.appendChild(this.textRoot);
-        
+
         this.rendererRoot.appendChild(this.root);
         this.container.appendChild(this.rendererRoot);
-        
+
         if(options && (options.zIndexing || options.yOrdering)) {
             this.indexer = new OpenLayers.ElementsIndexer(options.yOrdering);
         }
     },
-    
+
     /**
      * Method: destroy
      */
     destroy: function() {
 
-        this.clear(); 
+        this.clear();
 
         this.rendererRoot = null;
         this.root = null;
@@ -7862,11 +7862,11 @@
 
         OpenLayers.Renderer.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: clear
      * Remove all the elements from the root
-     */    
+     */
     clear: function() {
         if (this.vectorRoot) {
             while (this.vectorRoot.childNodes.length > 0) {
@@ -7883,26 +7883,26 @@
         }
     },
 
-    /** 
+    /**
      * Method: getNodeType
      * This function is in charge of asking the specific renderer which type
      *     of node to create for the given geometry and style. All geometries
      *     in an Elements-based renderer consist of one node and some
      *     attributes. We have the nodeFactory() function which creates a node
      *     for us, but it takes a 'type' as input, and that is precisely what
-     *     this function tells us.  
-     *  
+     *     this function tells us.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} The corresponding node type for the specified geometry
      */
     getNodeType: function(geometry, style) { },
 
-    /** 
-     * Method: drawGeometry 
+    /**
+     * Method: drawGeometry
      * Draw the geometry, creating new nodes, setting paths, setting style,
      *     setting featureId on the node.  This method should only be called
      *     by the renderer itself.
@@ -7911,7 +7911,7 @@
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the geometry has been drawn completely; null if
      *     incomplete; false otherwise
@@ -7951,16 +7951,16 @@
         }
         return rendered;
     },
-    
+
     /**
      * Method: redrawNode
-     * 
+     *
      * Parameters:
      * id - {String}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the complete geometry could be drawn, null if parts of
      *     the geometry could not be drawn, false otherwise
@@ -7968,7 +7968,7 @@
     redrawNode: function(id, geometry, style, featureId) {
         // Get the node if it's already on the map.
         var node = this.nodeFactory(id, this.getNodeType(geometry, style));
-        
+
         // Set the data for the node, then draw it.
         node._featureId = featureId;
         node._geometry = geometry;
@@ -7979,9 +7979,9 @@
         if(drawResult === false) {
             return false;
         }
-         
+
         node = drawResult.node;
-        
+
         // Insert the node into the indexer so it can show us where to
         // place it. Note that this operation is O(log(n)). If there's a
         // performance problem (when dragging, for instance) this is
@@ -7996,39 +7996,39 @@
         } else {
             // if there's no indexer, simply append the node to root,
             // but only if the node is a new one
-            if (node.parentNode !== this.vectorRoot){ 
+            if (node.parentNode !== this.vectorRoot){
                 this.vectorRoot.appendChild(node);
             }
         }
-        
+
         this.postDraw(node);
-        
+
         return drawResult.complete;
     },
-    
+
     /**
      * Method: redrawBackgroundNode
      * Redraws the node using special 'background' style properties. Basically
-     *     just calls redrawNode(), but instead of directly using the 
-     *     'externalGraphic', 'graphicXOffset', 'graphicYOffset', and 
-     *     'graphicZIndex' properties directly from the specified 'style' 
-     *     parameter, we create a new style object and set those properties 
-     *     from the corresponding 'background'-prefixed properties from 
+     *     just calls redrawNode(), but instead of directly using the
+     *     'externalGraphic', 'graphicXOffset', 'graphicYOffset', and
+     *     'graphicZIndex' properties directly from the specified 'style'
+     *     parameter, we create a new style object and set those properties
+     *     from the corresponding 'background'-prefixed properties from
      *     specified 'style' parameter.
-     * 
+     *
      * Parameters:
      * id - {String}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the complete geometry could be drawn, null if parts of
      *     the geometry could not be drawn, false otherwise
      */
     redrawBackgroundNode: function(id, geometry, style, featureId) {
         var backgroundStyle = OpenLayers.Util.extend({}, style);
-        
+
         // Set regular style attributes to apply to the background styles.
         backgroundStyle.externalGraphic = backgroundStyle.backgroundGraphic;
         backgroundStyle.graphicXOffset = backgroundStyle.backgroundXOffset;
@@ -8036,17 +8036,17 @@
         backgroundStyle.graphicZIndex = backgroundStyle.backgroundGraphicZIndex;
         backgroundStyle.graphicWidth = backgroundStyle.backgroundWidth || backgroundStyle.graphicWidth;
         backgroundStyle.graphicHeight = backgroundStyle.backgroundHeight || backgroundStyle.graphicHeight;
-        
+
         // Erase background styles.
         backgroundStyle.backgroundGraphic = null;
         backgroundStyle.backgroundXOffset = null;
         backgroundStyle.backgroundYOffset = null;
         backgroundStyle.backgroundGraphicZIndex = null;
-        
+
         return this.redrawNode(
-            id + this.BACKGROUND_ID_SUFFIX, 
-            geometry, 
-            backgroundStyle, 
+            id + this.BACKGROUND_ID_SUFFIX,
+            geometry,
+            backgroundStyle,
             null
         );
     },
@@ -8061,7 +8061,7 @@
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {Object} a hash with properties "node" (the drawn node) and "complete"
      *     (null if parts of the geometry could not be drawn, false if nothing
@@ -8108,8 +8108,8 @@
                 break;
         }
 
-        node._style = style; 
-        node._options = options; 
+        node._style = style;
+        node._options = options;
 
         //set style
         //TBD simplify this
@@ -8122,129 +8122,129 @@
             return false;
         }
     },
-    
+
     /**
      * Method: postDraw
      * Things that have do be done after the geometry node is appended
      *     to its parent node. To be overridden by subclasses.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      */
     postDraw: function(node) {},
-    
+
     /**
      * Method: drawPoint
-     * Virtual function for drawing Point Geometry. 
+     * Virtual function for drawing Point Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the point
-     */ 
+     */
     drawPoint: function(node, geometry) {},
 
     /**
      * Method: drawLineString
-     * Virtual function for drawing LineString Geometry. 
+     * Virtual function for drawing LineString Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components of
      *     the linestring, or false if nothing could be drawn
-     */ 
+     */
     drawLineString: function(node, geometry) {},
 
     /**
      * Method: drawLinearRing
-     * Virtual function for drawing LinearRing Geometry. 
+     * Virtual function for drawing LinearRing Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the linear ring, or false if nothing could be drawn
-     */ 
+     */
     drawLinearRing: function(node, geometry) {},
 
     /**
      * Method: drawPolygon
-     * Virtual function for drawing Polygon Geometry. 
+     * Virtual function for drawing Polygon Geometry.
      *    Should be implemented by subclasses.
      *    This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the polygon, or false if nothing could be drawn
-     */ 
+     */
     drawPolygon: function(node, geometry) {},
 
     /**
      * Method: drawRectangle
-     * Virtual function for drawing Rectangle Geometry. 
+     * Virtual function for drawing Rectangle Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the rectangle
-     */ 
+     */
     drawRectangle: function(node, geometry) {},
 
     /**
      * Method: drawCircle
-     * Virtual function for drawing Circle Geometry. 
+     * Virtual function for drawing Circle Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the circle
-     */ 
+     */
     drawCircle: function(node, geometry) {},
 
     /**
      * Method: drawSurface
-     * Virtual function for drawing Surface Geometry. 
+     * Virtual function for drawing Surface Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the surface
-     */ 
+     */
     drawSurface: function(node, geometry) {},
 
     /**
      * Method: removeText
      * Removes a label
-     * 
+     *
      * Parameters:
      * featureId - {String}
      */
@@ -8257,12 +8257,12 @@
 
     /**
      * Method: getFeatureIdFromEvent
-     * 
+     *
      * Parameters:
      * evt - {Object} An <OpenLayers.Event> object
      *
      * Returns:
-     * {<OpenLayers.Geometry>} A geometry from an event that 
+     * {<OpenLayers.Geometry>} A geometry from an event that
      *     happened on a layer.
      */
     getFeatureIdFromEvent: function(evt) {
@@ -8273,13 +8273,13 @@
         return featureId;
     },
 
-    /** 
+    /**
      * Method: eraseGeometry
-     * Erase a geometry from the renderer. In the case of a multi-geometry, 
-     *     we cycle through and recurse on ourselves. Otherwise, we look for a 
+     * Erase a geometry from the renderer. In the case of a multi-geometry,
+     *     we cycle through and recurse on ourselves. Otherwise, we look for a
      *     node with the geometry.id, destroy its geometry, and remove it from
      *     the DOM.
-     * 
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      */
@@ -8291,7 +8291,7 @@
             for (var i=0, len=geometry.components.length; i<len; i++) {
                 this.eraseGeometry(geometry.components[i]);
             }
-        } else {    
+        } else {
             var element = OpenLayers.Util.getElement(geometry.id);
             if (element && element.parentNode) {
                 if (element.geometry) {
@@ -8303,7 +8303,7 @@
                 if (this.indexer) {
                     this.indexer.remove(element);
                 }
-                
+
                 if (element._style.backgroundGraphic) {
                     var backgroundId = geometry.id + this.BACKGROUND_ID_SUFFIX;
                     var bElem = OpenLayers.Util.getElement(backgroundId);
@@ -8317,17 +8317,17 @@
         }
     },
 
-    /** 
+    /**
      * Method: nodeFactory
      * Create new node of the specified type, with the (optional) specified id.
-     * 
+     *
      * If node already exists with same ID and a different type, we remove it
      *     and then call ourselves again to recreate it.
-     * 
+     *
      * Parameters:
      * id - {String}
      * type - {String} type Kind of node to draw.
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id.
      */
@@ -8343,27 +8343,27 @@
         }
         return node;
     },
-    
-    /** 
+
+    /**
      * Method: nodeTypeCompare
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * type - {String} Kind of node
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the specified node is of the specified type
      *     This function must be overridden by subclasses.
      */
     nodeTypeCompare: function(node, type) {},
-    
-    /** 
+
+    /**
      * Method: createNode
-     * 
+     *
      * Parameters:
      * type - {String} Kind of node to draw.
      * id - {String} Id for node.
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id.
      *     This function must be overridden by subclasses.
@@ -8373,7 +8373,7 @@
     /**
      * Method: moveRoot
      * moves this renderer's root to a different renderer.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      */
@@ -8385,27 +8385,27 @@
         root.parentNode.removeChild(root);
         renderer.rendererRoot.appendChild(root);
     },
-    
+
     /**
      * Method: getRenderLayerId
      * Gets the layer that this renderer's output appears on. If moveRoot was
      * used, this will be different from the id of the layer containing the
      * features rendered by this renderer.
-     * 
+     *
      * Returns:
      * {String} the id of the output layer.
      */
     getRenderLayerId: function() {
         return this.root.parentNode.parentNode.id;
     },
-    
+
     /**
      * Method: isComplexSymbol
      * Determines if a symbol cannot be rendered using drawCircle
-     * 
+     *
      * Parameters:
      * graphicName - {String}
-     * 
+     *
      * Returns
      * {Boolean} true if the symbol is complex, false if not
      */
@@ -8450,7 +8450,7 @@
  *  - <OpenLayers.Strategy>
  */
 OpenLayers.Strategy.Fixed = OpenLayers.Class(OpenLayers.Strategy, {
-    
+
     /**
      * APIProperty: preload
      * {Boolean} Load data before layer made visible. Enabling this may result
@@ -8505,11 +8505,11 @@
         }
         return false;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivate the strategy.  Undo what is done in <activate>.
-     * 
+     *
      * Returns:
      * {Boolean} The strategy was successfully deactivated.
      */
@@ -8586,38 +8586,38 @@
  * Namespace: OpenLayers.Tween
  */
 OpenLayers.Tween = OpenLayers.Class({
-    
+
     /**
      * Constant: INTERVAL
      * {int} Interval in milliseconds between 2 steps
      */
     INTERVAL: 10,
-    
+
     /**
      * APIProperty: easing
      * {<OpenLayers.Easing>(Function)} Easing equation used for the animation
      *     Defaultly set to OpenLayers.Easing.Expo.easeOut
      */
     easing: null,
-    
+
     /**
      * APIProperty: begin
      * {Object} Values to start the animation with
      */
     begin: null,
-    
+
     /**
      * APIProperty: finish
      * {Object} Values to finish the animation with
      */
     finish: null,
-    
+
     /**
      * APIProperty: duration
      * {int} duration of the tween (number of steps)
      */
     duration: null,
-    
+
     /**
      * APIProperty: callbacks
      * {Object} An object with start, eachStep and done properties whose values
@@ -8625,40 +8625,40 @@
      *     current computed value as argument.
      */
     callbacks: null,
-    
+
     /**
      * Property: time
      * {int} Step counter
      */
     time: null,
-    
+
     /**
      * Property: interval
      * {int} Interval id returned by window.setInterval
      */
     interval: null,
-    
+
     /**
      * Property: playing
      * {Boolean} Tells if the easing is currently playing
      */
     playing: false,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Tween
      * Creates a Tween.
      *
      * Parameters:
      * easing - {<OpenLayers.Easing>(Function)} easing function method to use
-     */ 
+     */
     initialize: function(easing) {
         this.easing = (easing) ? easing : OpenLayers.Easing.Expo.easeOut;
     },
-    
+
     /**
      * APIMethod: start
      * Plays the Tween, and calls the callback method on each step
-     * 
+     *
      * Parameters:
      * begin - {Object} values to start the animation with
      * finish - {Object} values to finish the animation with
@@ -8682,7 +8682,7 @@
         this.interval = window.setInterval(
             OpenLayers.Function.bind(this.play, this), this.INTERVAL);
     },
-    
+
     /**
      * APIMethod: stop
      * Stops the Tween, and calls the done callback
@@ -8692,7 +8692,7 @@
         if (!this.playing) {
             return;
         }
-        
+
         if (this.callbacks && this.callbacks.done) {
             this.callbacks.done.call(this, this.finish);
         }
@@ -8700,7 +8700,7 @@
         this.interval = null;
         this.playing = false;
     },
-    
+
     /**
      * Method: play
      * Calls the appropriate easing method
@@ -8713,16 +8713,16 @@
             if (b == null || f == null || isNaN(b) || isNaN(f)) {
                 OpenLayers.Console.error('invalid value for Tween');
             }
-            
+
             var c = f - b;
             value[i] = this.easing.apply(this, [this.time, b, c, this.duration]);
         }
         this.time++;
-        
+
         if (this.callbacks && this.callbacks.eachStep) {
             this.callbacks.eachStep.call(this, value);
         }
-        
+
         if (this.time > this.duration) {
             if (this.callbacks && this.callbacks.done) {
                 this.callbacks.done.call(this, this.finish);
@@ -8732,7 +8732,7 @@
             this.interval = null;
         }
     },
-    
+
     /**
      * Create empty functions for all easing methods.
      */
@@ -8741,7 +8741,7 @@
 
 /**
  * Namespace: OpenLayers.Easing
- * 
+ *
  * Credits:
  *      Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>
  */
@@ -8756,10 +8756,10 @@
  * Namespace: OpenLayers.Easing.Linear
  */
 OpenLayers.Easing.Linear = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8769,10 +8769,10 @@
     easeIn: function(t, b, c, d) {
         return c*t/d + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8782,10 +8782,10 @@
     easeOut: function(t, b, c, d) {
         return c*t/d + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8803,10 +8803,10 @@
  * Namespace: OpenLayers.Easing.Expo
  */
 OpenLayers.Easing.Expo = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8816,10 +8816,10 @@
     easeIn: function(t, b, c, d) {
         return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8829,10 +8829,10 @@
     easeOut: function(t, b, c, d) {
         return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8853,10 +8853,10 @@
  * Namespace: OpenLayers.Easing.Quad
  */
 OpenLayers.Easing.Quad = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8866,10 +8866,10 @@
     easeIn: function(t, b, c, d) {
         return c*(t/=d)*t + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8879,10 +8879,10 @@
     easeOut: function(t, b, c, d) {
         return -c *(t/=d)*(t-2) + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8911,11 +8911,11 @@
 
 /**
  * Class: OpenLayers.Control.ArgParser
- * The ArgParser control adds location bar querystring parsing functionality 
+ * The ArgParser control adds location bar querystring parsing functionality
  * to an OpenLayers Map.
- * When added to a Map control, on a page load/refresh, the Map will 
- * automatically take the href string and parse it for lon, lat, zoom, and 
- * layers information. 
+ * When added to a Map control, on a page load/refresh, the Map will
+ * automatically take the href string and parse it for lon, lat, zoom, and
+ * layers information.
  *
  * Inherits from:
  *  - <OpenLayers.Control>
@@ -8927,7 +8927,7 @@
      * {<OpenLayers.LonLat>}
      */
     center: null,
-    
+
     /**
      * Parameter: zoom
      * {int}
@@ -8935,14 +8935,14 @@
     zoom: null,
 
     /**
-     * Parameter: layers 
+     * Parameter: layers
      * {Array(<OpenLayers.Layer>)}
      */
     layers: null,
-    
-    /** 
+
+    /**
      * APIProperty: displayProjection
-     * {<OpenLayers.Projection>} Requires proj4js support. 
+     * {<OpenLayers.Projection>} Requires proj4js support.
      *     Projection used when reading the coordinates from the URL. This will
      *
      *     reproject the map coordinates from the URL into the map's
@@ -8951,9 +8951,9 @@
      *     If you are using this functionality, be aware that any permalink
      *     which is added to the map will determine the coordinate type which
      *     is read from the URL, which means you should not add permalinks with
-     *     different displayProjections to the same map. 
+     *     different displayProjections to the same map.
      */
-    displayProjection: null, 
+    displayProjection: null,
 
     /**
      * Constructor: OpenLayers.Control.ArgParser
@@ -8967,10 +8967,10 @@
 
     /**
      * Method: setMap
-     * Set the map property for the control. 
-     * 
+     * Set the map property for the control.
+     *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         OpenLayers.Control.prototype.setMap.apply(this, arguments);
@@ -8980,14 +8980,14 @@
             var control = this.map.controls[i];
             if ( (control != this) &&
                  (control.CLASS_NAME == "OpenLayers.Control.ArgParser") ) {
-                
-                // If a second argparser is added to the map, then we 
+
+                // If a second argparser is added to the map, then we
                 // override the displayProjection to be the one added to the
-                // map. 
+                // map.
                 if (control.displayProjection != this.displayProjection) {
                     this.displayProjection = control.displayProjection;
-                }    
-                
+                }
+
                 break;
             }
         }
@@ -8997,9 +8997,9 @@
             // Be careful to set layer first, to not trigger unnecessary layer loads
             if (args.layers) {
                 this.layers = args.layers;
-    
-                // when we add a new layer, set its visibility 
-                this.map.events.register('addlayer', this, 
+
+                // when we add a new layer, set its visibility
+                this.map.events.register('addlayer', this,
                                          this.configureLayers);
                 this.configureLayers();
             }
@@ -9009,51 +9009,51 @@
                 if (args.zoom) {
                     this.zoom = parseInt(args.zoom);
                 }
-    
+
                 // when we add a new baselayer to see when we can set the center
-                this.map.events.register('changebaselayer', this, 
+                this.map.events.register('changebaselayer', this,
                                          this.setCenter);
                 this.setCenter();
             }
         }
     },
-   
-    /** 
+
+    /**
      * Method: setCenter
      * As soon as a baseLayer has been loaded, we center and zoom
      *   ...and remove the handler.
      */
     setCenter: function() {
-        
+
         if (this.map.baseLayer) {
             //dont need to listen for this one anymore
-            this.map.events.unregister('changebaselayer', this, 
+            this.map.events.unregister('changebaselayer', this,
                                        this.setCenter);
-            
+
             if (this.displayProjection) {
-                this.center.transform(this.displayProjection, 
-                                      this.map.getProjectionObject()); 
-            }      
+                this.center.transform(this.displayProjection,
+                                      this.map.getProjectionObject());
+            }
 
             this.map.setCenter(this.center, this.zoom);
         }
     },
 
-    /** 
+    /**
      * Method: configureLayers
-     * As soon as all the layers are loaded, cycle through them and 
-     *   hide or show them. 
+     * As soon as all the layers are loaded, cycle through them and
+     *   hide or show them.
      */
     configureLayers: function() {
 
-        if (this.layers.length == this.map.layers.length) { 
+        if (this.layers.length == this.map.layers.length) {
             this.map.events.unregister('addlayer', this, this.configureLayers);
 
             for(var i=0, len=this.layers.length; i<len; i++) {
-                
+
                 var layer = this.map.layers[i];
                 var c = this.layers.charAt(i);
-                
+
                 if (c == "B") {
                     this.map.setBaseLayer(layer);
                 } else if ( (c == "T") || (c == "F") ) {
@@ -9061,7 +9061,7 @@
                 }
             }
         }
-    },     
+    },
 
     CLASS_NAME: "OpenLayers.Control.ArgParser"
 });
@@ -9089,38 +9089,38 @@
  */
 OpenLayers.Control.PanZoom = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * APIProperty: slideFactor
-     * {Integer} Number of pixels by which we'll pan the map in any direction 
+     * {Integer} Number of pixels by which we'll pan the map in any direction
      *     on clicking the arrow buttons.  If you want to pan by some ratio
      *     of the map dimensions, use <slideRatio> instead.
      */
     slideFactor: 50,
 
-    /** 
+    /**
      * APIProperty: slideRatio
-     * {Number} The fraction of map width/height by which we'll pan the map            
+     * {Number} The fraction of map width/height by which we'll pan the map
      *     on clicking the arrow buttons.  Default is null.  If set, will
      *     override <slideFactor>. E.g. if slideRatio is .5, then the Pan Up
-     *     button will pan up half the map height. 
+     *     button will pan up half the map height.
      */
     slideRatio: null,
 
-    /** 
+    /**
      * Property: buttons
-     * {Array(DOMElement)} Array of Button Divs 
+     * {Array(DOMElement)} Array of Button Divs
      */
     buttons: null,
 
-    /** 
+    /**
      * Property: position
-     * {<OpenLayers.Pixel>} 
+     * {<OpenLayers.Pixel>}
      */
     position: null,
 
     /**
      * Constructor: OpenLayers.Control.PanZoom
-     * 
+     *
      * Parameters:
      * options - {Object}
      */
@@ -9144,8 +9144,8 @@
      * Method: draw
      *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
-     * 
+     * px - {<OpenLayers.Pixel>}
+     *
      * Returns:
      * {DOMElement} A reference to the container div for the PanZoom control.
      */
@@ -9164,26 +9164,26 @@
         px.y = centered.y+sz.h;
         this._addButton("panleft", "west-mini.png", px, sz);
         this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz);
-        this._addButton("pandown", "south-mini.png", 
+        this._addButton("pandown", "south-mini.png",
                         centered.add(0, sz.h*2), sz);
-        this._addButton("zoomin", "zoom-plus-mini.png", 
+        this._addButton("zoomin", "zoom-plus-mini.png",
                         centered.add(0, sz.h*3+5), sz);
-        this._addButton("zoomworld", "zoom-world-mini.png", 
+        this._addButton("zoomworld", "zoom-world-mini.png",
                         centered.add(0, sz.h*4+5), sz);
-        this._addButton("zoomout", "zoom-minus-mini.png", 
+        this._addButton("zoomout", "zoom-minus-mini.png",
                         centered.add(0, sz.h*5+5), sz);
         return this.div;
     },
-    
+
     /**
      * Method: _addButton
-     * 
+     *
      * Parameters:
-     * id - {String} 
-     * img - {String} 
-     * xy - {<OpenLayers.Pixel>} 
-     * sz - {<OpenLayers.Size>} 
-     * 
+     * id - {String}
+     * img - {String}
+     * xy - {<OpenLayers.Pixel>}
+     * sz - {<OpenLayers.Size>}
+     *
      * Returns:
      * {DOMElement} A Div (an alphaImageDiv, to be precise) that contains the
      *     image of the button, and has all the proper event handlers set.
@@ -9191,21 +9191,21 @@
     _addButton:function(id, img, xy, sz) {
         var imgLocation = OpenLayers.Util.getImagesLocation() + img;
         var btn = OpenLayers.Util.createAlphaImageDiv(
-                                    this.id + "_" + id, 
+                                    this.id + "_" + id,
                                     xy, sz, imgLocation, "absolute");
 
         //we want to add the outer div
         this.div.appendChild(btn);
 
-        OpenLayers.Event.observe(btn, "mousedown", 
+        OpenLayers.Event.observe(btn, "mousedown",
             OpenLayers.Function.bindAsEventListener(this.buttonDown, btn));
-        OpenLayers.Event.observe(btn, "dblclick", 
+        OpenLayers.Event.observe(btn, "dblclick",
             OpenLayers.Function.bindAsEventListener(this.doubleClick, btn));
-        OpenLayers.Event.observe(btn, "click", 
+        OpenLayers.Event.observe(btn, "click",
             OpenLayers.Function.bindAsEventListener(this.doubleClick, btn));
         btn.action = id;
         btn.map = this.map;
-    
+
         if(!this.slideRatio){
             var slideFactorPixels = this.slideFactor;
             var getSlideFactor = function() {
@@ -9224,10 +9224,10 @@
         this.buttons.push(btn);
         return btn;
     },
-    
+
     /**
      * Method: _removeButton
-     * 
+     *
      * Parameters:
      * btn - {Object}
      */
@@ -9237,7 +9237,7 @@
         this.div.removeChild(btn);
         OpenLayers.Util.removeItem(this.buttons, btn);
     },
-    
+
     /**
      * Method: removeButtons
      */
@@ -9246,12 +9246,12 @@
             this._removeButton(this.buttons[i]);
         }
     },
-    
+
     /**
      * Method: doubleClick
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -9260,12 +9260,12 @@
         OpenLayers.Event.stop(evt);
         return false;
     },
-    
+
     /**
      * Method: buttonDown
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     buttonDown: function (evt) {
         if (!OpenLayers.Event.isLeftClick(evt)) {
@@ -9273,26 +9273,26 @@
         }
 
         switch (this.action) {
-            case "panup": 
+            case "panup":
                 this.map.pan(0, -this.getSlideFactor("h"));
                 break;
-            case "pandown": 
+            case "pandown":
                 this.map.pan(0, this.getSlideFactor("h"));
                 break;
-            case "panleft": 
+            case "panleft":
                 this.map.pan(-this.getSlideFactor("w"), 0);
                 break;
-            case "panright": 
+            case "panright":
                 this.map.pan(this.getSlideFactor("w"), 0);
                 break;
-            case "zoomin": 
-                this.map.zoomIn(); 
+            case "zoomin":
+                this.map.zoomIn();
                 break;
-            case "zoomout": 
-                this.map.zoomOut(); 
+            case "zoomout":
+                this.map.zoomOut();
                 break;
-            case "zoomworld": 
-                this.map.zoomToMaxExtent(); 
+            case "zoomworld":
+                this.map.zoomToMaxExtent();
                 break;
         }
 
@@ -9318,7 +9318,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2007 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 /**
@@ -9327,13 +9327,13 @@
 
 /**
  * Class: OpenLayers.Control.ScaleLine
- * The ScaleLine displays a small line indicator representing the current 
+ * The ScaleLine displays a small line indicator representing the current
  * map scale on the map. By default it is drawn in the lower left corner of
  * the map.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Control>
- *  
+ *
  * Is a very close copy of:
  *  - <OpenLayers.Control.Scale>
  */
@@ -9350,7 +9350,7 @@
      * {String} Units for zoomed out on top bar.  Default is km.
      */
     topOutUnits: "km",
-    
+
     /**
      * Property: topInUnits
      * {String} Units for zoomed in on top bar.  Default is m.
@@ -9368,7 +9368,7 @@
      * {String} Units for zoomed in on bottom bar.  Default is ft.
      */
     bottomInUnits: "ft",
-    
+
     /**
      * Property: eTop
      * {DOMElement}
@@ -9384,18 +9384,18 @@
     /**
      * Constructor: OpenLayers.Control.ScaleLine
      * Create a new scale line control.
-     * 
+     *
      * Parameters:
      * options - {Object} An optional object whose properties will be used
      *     to extend the control.
      */
     initialize: function(options) {
-        OpenLayers.Control.prototype.initialize.apply(this, [options]);     
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
     },
 
     /**
      * Method: draw
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -9404,7 +9404,7 @@
         if (!this.eTop) {
             this.div.style.display = "block";
             this.div.style.position = "absolute";
-            
+
             // stick in the top bar
             this.eTop = document.createElement("div");
             this.eTop.className = this.displayClass + "Top";
@@ -9431,14 +9431,14 @@
         return this.div;
     },
 
-    /** 
+    /**
      * Method: getBarLen
      * Given a number, round it down to the nearest 1,2,5 times a power of 10.
      * That seems a fairly useful set of number groups to use.
-     * 
+     *
      * Parameters:
      * maxLen - {float}  the number we're rounding down from
-     * 
+     *
      * Returns:
      * {Float} the rounded number (less than or equal to maxLen)
      */
@@ -9446,7 +9446,7 @@
         // nearest power of 10 lower than maxLen
         var digits = parseInt(Math.log(maxLen) / Math.log(10));
         var pow10 = Math.pow(10, digits);
-        
+
         // ok, find first character
         var firstChar = parseInt(maxLen / pow10);
 
@@ -9478,9 +9478,9 @@
         var inches = OpenLayers.INCHES_PER_UNIT;
 
         // convert maxWidth to map units
-        var maxSizeData = this.maxWidth * res * inches[curMapUnits];  
+        var maxSizeData = this.maxWidth * res * inches[curMapUnits];
 
-        // decide whether to use large or small scale units     
+        // decide whether to use large or small scale units
         var topUnits;
         var bottomUnits;
         if(maxSizeData > 100000) {
@@ -9506,22 +9506,22 @@
         // and to pixel units
         var topPx = topMax / res;
         var bottomPx = bottomMax / res;
-        
+
         // now set the pixel widths
         // and the values inside them
-        
+
         if (this.eBottom.style.visibility == "visible"){
-            this.eBottom.style.width = Math.round(bottomPx) + "px"; 
+            this.eBottom.style.width = Math.round(bottomPx) + "px";
             this.eBottom.innerHTML = bottomRounded + " " + bottomUnits ;
         }
-            
+
         if (this.eTop.style.visibility == "visible"){
             this.eTop.style.width = Math.round(topPx) + "px";
             this.eTop.innerHTML = topRounded + " " + topUnits;
         }
-        
-    }, 
 
+    },
+
     CLASS_NAME: "OpenLayers.Control.ScaleLine"
 });
 
@@ -9544,64 +9544,64 @@
  */
 OpenLayers.Event = {
 
-    /** 
-     * Property: observers 
+    /**
+     * Property: observers
      * {Object} A hashtable cache of the event observers. Keyed by
-     * element._eventCacheID 
+     * element._eventCacheID
      */
     observers: false,
-    
-    /** 
-     * Constant: KEY_BACKSPACE 
-     * {int} 
+
+    /**
+     * Constant: KEY_BACKSPACE
+     * {int}
      */
     KEY_BACKSPACE: 8,
 
-    /** 
-     * Constant: KEY_TAB 
-     * {int} 
+    /**
+     * Constant: KEY_TAB
+     * {int}
      */
     KEY_TAB: 9,
 
-    /** 
-     * Constant: KEY_RETURN 
-     * {int} 
+    /**
+     * Constant: KEY_RETURN
+     * {int}
      */
     KEY_RETURN: 13,
 
-    /** 
-     * Constant: KEY_ESC 
-     * {int} 
+    /**
+     * Constant: KEY_ESC
+     * {int}
      */
     KEY_ESC: 27,
 
-    /** 
-     * Constant: KEY_LEFT 
-     * {int} 
+    /**
+     * Constant: KEY_LEFT
+     * {int}
      */
     KEY_LEFT: 37,
 
-    /** 
-     * Constant: KEY_UP 
-     * {int} 
+    /**
+     * Constant: KEY_UP
+     * {int}
      */
     KEY_UP: 38,
 
-    /** 
-     * Constant: KEY_RIGHT 
-     * {int} 
+    /**
+     * Constant: KEY_RIGHT
+     * {int}
      */
     KEY_RIGHT: 39,
 
-    /** 
-     * Constant: KEY_DOWN 
-     * {int} 
+    /**
+     * Constant: KEY_DOWN
+     * {int}
      */
     KEY_DOWN: 40,
 
-    /** 
-     * Constant: KEY_DELETE 
-     * {int} 
+    /**
+     * Constant: KEY_DELETE
+     * {int}
      */
     KEY_DELETE: 46,
 
@@ -9609,12 +9609,12 @@
     /**
      * Method: element
      * Cross browser event element detection.
-     * 
+     *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
-     * {DOMElement} The element that caused the event 
+     * {DOMElement} The element that caused the event
      */
     element: function(event) {
         return event.target || event.srcElement;
@@ -9622,11 +9622,11 @@
 
     /**
      * Method: isLeftClick
-     * Determine whether event was caused by a left click. 
+     * Determine whether event was caused by a left click.
      *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
      * {Boolean}
      */
@@ -9637,11 +9637,11 @@
 
     /**
      * Method: isRightClick
-     * Determine whether event was caused by a right mouse click. 
+     * Determine whether event was caused by a right mouse click.
      *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
      * {Boolean}
      */
@@ -9649,29 +9649,29 @@
         return (((event.which) && (event.which == 3)) ||
                 ((event.button) && (event.button == 2)));
     },
-     
+
     /**
      * Method: stop
-     * Stops an event from propagating. 
+     * Stops an event from propagating.
      *
-     * Parameters: 
-     * event - {Event} 
-     * allowDefault - {Boolean} If true, we stop the event chain but 
-     *                               still allow the default browser 
-     *                               behaviour (text selection, radio-button 
+     * Parameters:
+     * event - {Event}
+     * allowDefault - {Boolean} If true, we stop the event chain but
+     *                               still allow the default browser
+     *                               behaviour (text selection, radio-button
      *                               clicking, etc)
      *                               Default false
      */
     stop: function(event, allowDefault) {
-        
-        if (!allowDefault) { 
+
+        if (!allowDefault) {
             if (event.preventDefault) {
                 event.preventDefault();
             } else {
                 event.returnValue = false;
             }
         }
-                
+
         if (event.stopPropagation) {
             event.stopPropagation();
         } else {
@@ -9679,13 +9679,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: findElement
-     * 
+     *
      * Parameters:
-     * event - {Event} 
-     * tagName - {String} 
-     * 
+     * event - {Event}
+     * tagName - {String}
+     *
      * Returns:
      * {DOMElement} The first node with the given tagName, starting from the
      * node the event was triggered on and traversing the DOM upwards
@@ -9699,14 +9699,14 @@
         return element;
     },
 
-    /** 
+    /**
      * Method: observe
-     * 
+     *
      * Parameters:
-     * elementParam - {DOMElement || String} 
-     * name - {String} 
-     * observer - {function} 
-     * useCapture - {Boolean} 
+     * elementParam - {DOMElement || String}
+     * name - {String}
+     * observer - {function}
+     * useCapture - {Boolean}
      */
     observe: function(elementParam, name, observer, useCapture) {
         var element = OpenLayers.Util.getElement(elementParam);
@@ -9755,14 +9755,14 @@
         }
     },
 
-    /** 
+    /**
      * Method: stopObservingElement
-     * Given the id of an element to stop observing, cycle through the 
-     *   element's cached observers, calling stopObserving on each one, 
+     * Given the id of an element to stop observing, cycle through the
+     *   element's cached observers, calling stopObserving on each one,
      *   skipping those entries which can no longer be removed.
-     * 
+     *
      * parameters:
-     * elementParam - {DOMElement || String} 
+     * elementParam - {DOMElement || String}
      */
     stopObservingElement: function(elementParam) {
         var element = OpenLayers.Util.getElement(elementParam);
@@ -9775,8 +9775,8 @@
      * Method: _removeElementObservers
      *
      * Parameters:
-     * elementObservers - {Array(Object)} Array of (element, name, 
-     *                                         observer, usecapture) objects, 
+     * elementObservers - {Array(Object)} Array of (element, name,
+     *                                         observer, usecapture) objects,
      *                                         taken directly from hashtable
      */
     _removeElementObservers: function(elementObservers) {
@@ -9794,24 +9794,24 @@
 
     /**
      * Method: stopObserving
-     * 
+     *
      * Parameters:
-     * elementParam - {DOMElement || String} 
-     * name - {String} 
-     * observer - {function} 
-     * useCapture - {Boolean} 
-     *  
+     * elementParam - {DOMElement || String}
+     * name - {String}
+     * observer - {function}
+     * useCapture - {Boolean}
+     *
      * Returns:
      * {Boolean} Whether or not the event observer was removed
      */
     stopObserving: function(elementParam, name, observer, useCapture) {
         useCapture = useCapture || false;
-    
+
         var element = OpenLayers.Util.getElement(elementParam);
         var cacheID = element._eventCacheID;
 
         if (name == 'keypress') {
-            if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) || 
+            if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
                  element.detachEvent) {
               name = 'keydown';
             }
@@ -9821,27 +9821,27 @@
         var foundEntry = false;
         var elementObservers = OpenLayers.Event.observers[cacheID];
         if (elementObservers) {
-    
+
             // find the specific event type in the element's list
             var i=0;
             while(!foundEntry && i < elementObservers.length) {
                 var cacheEntry = elementObservers[i];
-    
+
                 if ((cacheEntry.name == name) &&
                     (cacheEntry.observer == observer) &&
                     (cacheEntry.useCapture == useCapture)) {
-    
+
                     elementObservers.splice(i, 1);
                     if (elementObservers.length == 0) {
                         delete OpenLayers.Event.observers[cacheID];
                     }
                     foundEntry = true;
-                    break; 
+                    break;
                 }
-                i++;           
+                i++;
             }
         }
-    
+
         //actually remove the event listener from browser
         if (foundEntry) {
             if (element.removeEventListener) {
@@ -9852,11 +9852,11 @@
         }
         return foundEntry;
     },
-    
-    /** 
+
+    /**
      * Method: unloadCache
      * Cycle through all the element entries in the events cache and call
-     *   stopObservingElement on each. 
+     *   stopObservingElement on each.
      */
     unloadCache: function() {
         // check for OpenLayers.Event before checking for observers, because
@@ -9865,7 +9865,7 @@
         if (OpenLayers.Event && OpenLayers.Event.observers) {
             for (var cacheID in OpenLayers.Event.observers) {
                 var elementObservers = OpenLayers.Event.observers[cacheID];
-                OpenLayers.Event._removeElementObservers.apply(this, 
+                OpenLayers.Event._removeElementObservers.apply(this,
                                                            [elementObservers]);
             }
             OpenLayers.Event.observers = false;
@@ -9891,65 +9891,65 @@
  */
 OpenLayers.Events = OpenLayers.Class({
 
-    /** 
+    /**
      * Constant: BROWSER_EVENTS
-     * {Array(String)} supported events 
+     * {Array(String)} supported events
      */
     BROWSER_EVENTS: [
         "mouseover", "mouseout",
-        "mousedown", "mouseup", "mousemove", 
+        "mousedown", "mouseup", "mousemove",
         "click", "dblclick", "rightclick", "dblrightclick",
         "resize", "focus", "blur"
     ],
 
-    /** 
-     * Property: listeners 
-     * {Object} Hashtable of Array(Function): events listener functions  
+    /**
+     * Property: listeners
+     * {Object} Hashtable of Array(Function): events listener functions
      */
     listeners: null,
 
-    /** 
-     * Property: object 
-     * {Object}  the code object issuing application events 
+    /**
+     * Property: object
+     * {Object}  the code object issuing application events
      */
     object: null,
 
-    /** 
-     * Property: element 
-     * {DOMElement}  the DOM element receiving browser events 
+    /**
+     * Property: element
+     * {DOMElement}  the DOM element receiving browser events
      */
     element: null,
 
-    /** 
-     * Property: eventTypes 
-     * {Array(String)}  list of support application events 
+    /**
+     * Property: eventTypes
+     * {Array(String)}  list of support application events
      */
     eventTypes: null,
 
-    /** 
-     * Property: eventHandler 
-     * {Function}  bound event handler attached to elements 
+    /**
+     * Property: eventHandler
+     * {Function}  bound event handler attached to elements
      */
     eventHandler: null,
 
-    /** 
-     * APIProperty: fallThrough 
-     * {Boolean} 
+    /**
+     * APIProperty: fallThrough
+     * {Boolean}
      */
     fallThrough: null,
 
-    /** 
+    /**
      * APIProperty: includeXY
      * {Boolean} Should the .xy property automatically be created for browser
      *    mouse events? In general, this should be false. If it is true, then
-     *    mouse events will automatically generate a '.xy' property on the 
+     *    mouse events will automatically generate a '.xy' property on the
      *    event object that is passed. (Prior to OpenLayers 2.7, this was true
      *    by default.) Otherwise, you can call the getMousePosition on the
      *    relevant events handler on the object available via the 'evt.object'
      *    property of the evt object. So, for most events, you can call:
-     *    function named(evt) { 
-     *        this.xy = this.object.events.getMousePosition(evt) 
-     *    } 
+     *    function named(evt) {
+     *        this.xy = this.object.events.getMousePosition(evt)
+     *    }
      *
      *    This option typically defaults to false for performance reasons:
      *    when creating an events object whose primary purpose is to manage
@@ -9959,12 +9959,12 @@
      *    This option is also used to control whether the events object caches
      *    offsets. If this is false, it will not: the reason for this is that
      *    it is only expected to be called many times if the includeXY property
-     *    is set to true. If you set this to true, you are expected to clear 
+     *    is set to true. If you set this to true, you are expected to clear
      *    the offset cache manually (using this.clearMouseCache()) if:
      *        the border of the element changes
      *        the location of the element in the page changes
     */
-    includeXY: false,      
+    includeXY: false,
 
     /**
      * Method: clearMouseListener
@@ -9981,7 +9981,7 @@
      * Parameters:
      * object - {Object} The js object to which this Events object  is being
      * added element - {DOMElement} A dom element to respond to browser events
-     * eventTypes - {Array(String)} Array of custom application events 
+     * eventTypes - {Array(String)} Array of custom application events
      * fallThrough - {Boolean} Allow events to fall through after these have
      *                         been handled?
      * options - {Object} Options for the events object.
@@ -9997,13 +9997,13 @@
         this.eventHandler = OpenLayers.Function.bindAsEventListener(
             this.handleBrowserEvent, this
         );
-        
+
         // to be used with observe and stopObserving
         this.clearMouseListener = OpenLayers.Function.bind(
             this.clearMouseCache, this
         );
 
-        // if eventTypes is specified, create a listeners list for each 
+        // if eventTypes is specified, create a listeners list for each
         // custom application event.
         this.eventTypes = [];
         if (eventTypes != null) {
@@ -10011,8 +10011,8 @@
                 this.addEventType(eventTypes[i]);
             }
         }
-        
-        // if a dom element is specified, add a listeners list 
+
+        // if a dom element is specified, add a listeners list
         // for browser events on the element and register them
         if (element != null) {
             this.attachToElement(element);
@@ -10044,7 +10044,7 @@
      * APIMethod: addEventType
      * Add a new event type to this events object.
      * If the event type has already been added, do nothing.
-     * 
+     *
      * Parameters:
      * eventName - {String}
      */
@@ -10069,17 +10069,17 @@
         for (var i=0, len=this.BROWSER_EVENTS.length; i<len; i++) {
             var eventType = this.BROWSER_EVENTS[i];
 
-            // every browser event has a corresponding application event 
+            // every browser event has a corresponding application event
             // (whether it's listened for or not).
             this.addEventType(eventType);
-            
+
             // use Prototype to register the event cross-browser
             OpenLayers.Event.observe(element, eventType, this.eventHandler);
         }
         // disable dragstart in IE so that mousedown/move/up works normally
         OpenLayers.Event.observe(element, "dragstart", OpenLayers.Event.stop);
     },
-    
+
     /**
      * Method: on
      * Convenience method for registering listeners with a common scope.
@@ -10106,31 +10106,31 @@
      * Register an event on the events object.
      *
      * When the event is triggered, the 'func' function will be called, in the
-     * context of 'obj'. Imagine we were to register an event, specifying an 
-     * OpenLayers.Bounds Object as 'obj'. When the event is triggered, the 
+     * context of 'obj'. Imagine we were to register an event, specifying an
+     * OpenLayers.Bounds Object as 'obj'. When the event is triggered, the
      * context in the callback function will be our Bounds object. This means
-     * that within our callback function, we can access the properties and 
-     * methods of the Bounds object through the "this" variable. So our 
-     * callback could execute something like: 
+     * that within our callback function, we can access the properties and
+     * methods of the Bounds object through the "this" variable. So our
+     * callback could execute something like:
      * :    leftStr = "Left: " + this.left;
-     *   
+     *
      *                   or
-     *  
+     *
      * :    centerStr = "Center: " + this.getCenterLonLat();
      *
      * Parameters:
      * type - {String} Name of the event to register
      * obj - {Object} The object to bind the context to for the callback#.
-     *                     If no object is specified, default is the Events's 
+     *                     If no object is specified, default is the Events's
      *                     'object' property.
-     * func - {Function} The callback function. If no callback is 
+     * func - {Function} The callback function. If no callback is
      *                        specified, this function does nothing.
-     * 
-     * 
+     *
+     *
      */
     register: function (type, obj, func) {
 
-        if ( (func != null) && 
+        if ( (func != null) &&
              (OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) {
 
             if (obj == null)  {
@@ -10145,17 +10145,17 @@
      * APIMethod: registerPriority
      * Same as register() but adds the new listener to the *front* of the
      *     events queue instead of to the end.
-     *    
-     *     TODO: get rid of this in 3.0 - Decide whether listeners should be 
+     *
+     *     TODO: get rid of this in 3.0 - Decide whether listeners should be
      *     called in the order they were registered or in reverse order.
      *
      *
      * Parameters:
      * type - {String} Name of the event to register
      * obj - {Object} The object to bind the context to for the callback#.
-     *                If no object is specified, default is the Events's 
+     *                If no object is specified, default is the Events's
      *                'object' property.
-     * func - {Function} The callback function. If no callback is 
+     * func - {Function} The callback function. If no callback is
      *                   specified, this function does nothing.
      */
     registerPriority: function (type, obj, func) {
@@ -10170,7 +10170,7 @@
             }
         }
     },
-    
+
     /**
      * Method: un
      * Convenience method for unregistering listeners with a common scope.
@@ -10196,9 +10196,9 @@
      * APIMethod: unregister
      *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      * obj - {Object} If none specified, defaults to this.object
-     * func - {Function} 
+     * func - {Function}
      */
     unregister: function (type, obj, func) {
         if (obj == null)  {
@@ -10215,13 +10215,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: remove
      * Remove all listeners for a given event type. If type is not registered,
      *     does nothing.
      *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      */
     remove: function(type) {
         if (this.listeners[type] != null) {
@@ -10231,10 +10231,10 @@
 
     /**
      * APIMethod: triggerEvent
-     * Trigger a specified registered event.  
-     * 
+     * Trigger a specified registered event.
+     *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      * evt - {Event}
      *
      * Returns:
@@ -10258,7 +10258,7 @@
         if(!evt.type) {
             evt.type = type;
         }
-    
+
         // execute all callbacks registered for specified type
         // get a clone of the listeners array to
         // allow for splicing during callbacks
@@ -10274,7 +10274,7 @@
             }
         }
         // don't fall through to other DOM elements
-        if (!this.fallThrough) {           
+        if (!this.fallThrough) {
             OpenLayers.Event.stop(evt, true);
         }
         return continueChain;
@@ -10282,38 +10282,38 @@
 
     /**
      * Method: handleBrowserEvent
-     * Basically just a wrapper to the triggerEvent() function, but takes 
-     *     care to set a property 'xy' on the event with the current mouse 
+     * Basically just a wrapper to the triggerEvent() function, but takes
+     *     care to set a property 'xy' on the event with the current mouse
      *     position.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     handleBrowserEvent: function (evt) {
         if (this.includeXY) {
             evt.xy = this.getMousePosition(evt);
-        } 
+        }
         this.triggerEvent(evt.type, evt);
     },
 
     /**
      * APIMethod: clearMouseCache
-     * Clear cached data about the mouse position. This should be called any 
-     *     time the element that events are registered on changes position 
+     * Clear cached data about the mouse position. This should be called any
+     *     time the element that events are registered on changes position
      *     within the page.
      */
-    clearMouseCache: function() { 
+    clearMouseCache: function() {
         this.element.scrolls = null;
         this.element.lefttop = null;
         this.element.offsets = null;
-    },      
+    },
 
     /**
      * Method: getMousePosition
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
-     * 
+     * evt - {Event}
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The current xy coordinate of the mouse, adjusted
      *                      for offsets
@@ -10325,7 +10325,7 @@
             OpenLayers.Event.observe(window, "scroll", this.clearMouseListener);
             this.element.hasScrollEvent = true;
         }
-        
+
         if (!this.element.scrolls) {
             this.element.scrolls = [
                 (document.documentElement.scrollLeft
@@ -10341,7 +10341,7 @@
                 (document.documentElement.clientTop  || 0)
             ];
         }
-        
+
         if (!this.element.offsets) {
             this.element.offsets = OpenLayers.Util.pagePosition(this.element);
             this.element.offsets[0] += this.element.scrolls[0];
@@ -10349,10 +10349,10 @@
         }
         return new OpenLayers.Pixel(
             (evt.clientX + this.element.scrolls[0]) - this.element.offsets[0]
-                         - this.element.lefttop[0], 
+                         - this.element.lefttop[0],
             (evt.clientY + this.element.scrolls[1]) - this.element.offsets[1]
                          - this.element.lefttop[1]
-        ); 
+        );
     },
 
     CLASS_NAME: "OpenLayers.Events"
@@ -10376,13 +10376,13 @@
  *     of OpenLayers.Format are expected to have read and write methods.
  */
 OpenLayers.Format = OpenLayers.Class({
-    
+
     /**
      * Property: options
      * {Object} A reference to options passed to the constructor.
      */
     options: null,
-    
+
     /**
      * APIProperty: externalProjection
      * {<OpenLayers.Projection>} When passed a externalProjection and
@@ -10390,7 +10390,7 @@
      *     reads or writes. The externalProjection is the projection used by
      *     the content which is passed into read or which comes out of write.
      *     In order to reproject, a projection transformation function for the
-     *     specified projections must be available. This support may be 
+     *     specified projections must be available. This support may be
      *     provided via proj4js or via a custom transformation function. See
      *     {<OpenLayers.Projection.addTransform>} for more information on
      *     custom transformations.
@@ -10444,7 +10444,7 @@
         OpenLayers.Util.extend(this, options);
         this.options = options;
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up.
@@ -10455,8 +10455,8 @@
     /**
      * Method: read
      * Read data from a string, and return an object whose type depends on the
-     * subclass. 
-     * 
+     * subclass.
+     *
      * Parameters:
      * data - {string} Data to read/parse.
      *
@@ -10466,10 +10466,10 @@
     read: function(data) {
         OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));
     },
-    
+
     /**
      * Method: write
-     * Accept an object, and return a string. 
+     * Accept an object, and return a string.
      *
      * Parameters:
      * object - {Object} Object to be serialized
@@ -10482,7 +10482,7 @@
     },
 
     CLASS_NAME: "OpenLayers.Format"
-});     
+});
 /* ======================================================================
     OpenLayers/Lang/en.js
    ====================================================================== */
@@ -10579,7 +10579,7 @@
     'reprojectDeprecated':
         "You are using the 'reproject' option " +
         "on the ${layerName} layer. This option is deprecated: " +
-        "its use was designed to support displaying data over commercial " + 
+        "its use was designed to support displaying data over commercial " +
         "basemaps, but that functionality should now be achieved by using " +
         "Spherical Mercator support. More information is available from " +
         "http://trac.openlayers.org/wiki/SphericalMercator.",
@@ -10604,7 +10604,7 @@
     // console message
     'pagePositionFailed':
         "OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",
-                    
+
     'end': '',
 
     // console message
@@ -10625,36 +10625,36 @@
 
 /**
  * Class: OpenLayers.Popup.AnchoredBubble
- * 
- * Inherits from: 
+ *
+ * Inherits from:
  *  - <OpenLayers.Popup.Anchored>
  */
-OpenLayers.Popup.AnchoredBubble = 
+OpenLayers.Popup.AnchoredBubble =
   OpenLayers.Class(OpenLayers.Popup.Anchored, {
 
     /**
      * Property: rounded
      * {Boolean} Has the popup been rounded yet?
      */
-    rounded: false, 
-    
-    /** 
+    rounded: false,
+
+    /**
      * Constructor: OpenLayers.Popup.AnchoredBubble
-     * 
+     *
      * Parameters:
      * id - {String}
      * lonlat - {<OpenLayers.LonLat>}
      * contentSize - {<OpenLayers.Size>}
      * contentHTML - {String}
-     * anchor - {Object} Object to which we'll anchor the popup. Must expose 
-     *     a 'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>) 
+     * anchor - {Object} Object to which we'll anchor the popup. Must expose
+     *     a 'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>)
      *     (Note that this is generally an <OpenLayers.Icon>).
      * closeBox - {Boolean}
      * closeBoxCallback - {Function} Function to be called on closeBox click.
      */
     initialize:function(id, lonlat, contentSize, contentHTML, anchor, closeBox,
                         closeBoxCallback) {
-        
+
         this.padding = new OpenLayers.Bounds(
             0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,
             0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE
@@ -10662,23 +10662,23 @@
         OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
     },
 
-    /** 
+    /**
      * Method: draw
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {DOMElement} Reference to a div that contains the drawn popup.
      */
     draw: function(px) {
-        
+
         OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments);
 
         this.setContentHTML();
-        
-        //set the popup color and opacity           
-        this.setBackgroundColor(); 
+
+        //set the popup color and opacity
+        this.setBackgroundColor();
         this.setOpacity();
 
         return this.div;
@@ -10695,71 +10695,71 @@
 
     /**
      * APIMethod: setSize
-     * 
+     *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
+    setSize:function(contentSize) {
         OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
 
         this.setRicoCorners();
-    },  
+    },
 
     /**
      * APIMethod: setBackgroundColor
-     * 
+     *
      * Parameters:
      * color - {String}
      */
-    setBackgroundColor:function(color) { 
+    setBackgroundColor:function(color) {
         if (color != undefined) {
-            this.backgroundColor = color; 
+            this.backgroundColor = color;
         }
-        
+
         if (this.div != null) {
             if (this.contentDiv != null) {
                 this.div.style.background = "transparent";
-                OpenLayers.Rico.Corner.changeColor(this.groupDiv, 
+                OpenLayers.Rico.Corner.changeColor(this.groupDiv,
                                                    this.backgroundColor);
             }
         }
-    },  
-    
+    },
+
     /**
      * APIMethod: setOpacity
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * opacity - {float}
      */
-    setOpacity:function(opacity) { 
+    setOpacity:function(opacity) {
         OpenLayers.Popup.Anchored.prototype.setOpacity.call(this, opacity);
-        
+
         if (this.div != null) {
             if (this.groupDiv != null) {
-                OpenLayers.Rico.Corner.changeOpacity(this.groupDiv, 
+                OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,
                                                      this.opacity);
             }
         }
-    },  
- 
-    /** 
+    },
+
+    /**
      * Method: setBorder
      * Always sets border to 0. Bubble Popups can not have a border.
-     * 
+     *
      * Parameters:
      * border - {Integer}
      */
-    setBorder:function(border) { 
+    setBorder:function(border) {
         this.border = 0;
-    },      
- 
-    /** 
+    },
+
+    /**
      * Method: setRicoCorners
      * Update RICO corners according to the popup's current relative postion.
      */
     setRicoCorners:function() {
-    
+
         var corners = this.getCornersToRound(this.relativePosition);
         var options = {corners: corners,
                          color: this.backgroundColor,
@@ -10772,14 +10772,14 @@
         } else {
             OpenLayers.Rico.Corner.reRound(this.groupDiv, options);
             //set the popup color and opacity
-            this.setBackgroundColor(); 
+            this.setBackgroundColor();
             this.setOpacity();
         }
     },
 
-    /** 
+    /**
      * Method: getCornersToRound
-     *  
+     *
      * Returns:
      * {String} The proper corners string ("tr tl bl br") for rico to round.
      */
@@ -10787,7 +10787,7 @@
 
         var corners = ['tl', 'tr', 'bl', 'br'];
 
-        //we want to round all the corners _except_ the opposite one. 
+        //we want to round all the corners _except_ the opposite one.
         var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
         OpenLayers.Util.removeItem(corners, corner);
 
@@ -10808,7 +10808,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 /**
@@ -10818,7 +10818,7 @@
 /**
  * Class: OpenLayers.Projection
  * Class for coordinate transforms between coordinate systems.
- *     Depends on the proj4js library. If proj4js is not available, 
+ *     Depends on the proj4js library. If proj4js is not available,
  *     then this is just an empty stub.
  */
 OpenLayers.Projection = OpenLayers.Class({
@@ -10828,7 +10828,7 @@
      * {Object} Proj4js.Proj instance.
      */
     proj: null,
-    
+
     /**
      * Property: projCode
      * {String}
@@ -10837,8 +10837,8 @@
 
     /**
      * Constructor: OpenLayers.Projection
-     * This class offers several methods for interacting with a wrapped 
-     *     pro4js projection object. 
+     * This class offers several methods for interacting with a wrapped
+     *     pro4js projection object.
      *
      * Parameters:
      * projCode - {String} A string identifying the Well Known Identifier for
@@ -10856,7 +10856,7 @@
             this.proj = new Proj4js.Proj(projCode);
         }
     },
-    
+
     /**
      * APIMethod: getCode
      * Get the string SRS code.
@@ -10867,10 +10867,10 @@
     getCode: function() {
         return this.proj ? this.proj.srsCode : this.projCode;
     },
-   
+
     /**
      * APIMethod: getUnits
-     * Get the units string for the projection -- returns null if 
+     * Get the units string for the projection -- returns null if
      *     proj4js is not available.
      *
      * Returns:
@@ -10904,7 +10904,7 @@
             return this.getCode() == projection.getCode();
         } else {
             return false;
-        }    
+        }
     },
 
     /* Method: destroy
@@ -10914,21 +10914,21 @@
         delete this.proj;
         delete this.projCode;
     },
-    
-    CLASS_NAME: "OpenLayers.Projection" 
-});     
 
+    CLASS_NAME: "OpenLayers.Projection"
+});
+
 /**
  * Property: transforms
  * Transforms is an object, with from properties, each of which may
- * have a to property. This allows you to define projections without 
+ * have a to property. This allows you to define projections without
  * requiring support for proj4js to be included.
  *
  * This object has keys which correspond to a 'source' projection object.  The
  * keys should be strings, corresponding to the projection.getCode() value.
  * Each source projection object should have a set of destination projection
- * keys included in the object. 
- * 
+ * keys included in the object.
+ *
  * Each value in the destination object should be a transformation function,
  * where the function is expected to be passed an object with a .x and a .y
  * property.  The function should return the object, with the .x and .y
@@ -10964,7 +10964,7 @@
  * APIMethod: transform
  * Transform a point coordinate from one projection to another.  Note that
  *     the input point is transformed in place.
- * 
+ *
  * Parameters:
  * point - {{OpenLayers.Geometry.Point> | Object} An object with x and y
  *     properties representing coordinates in those dimensions.
@@ -10977,10 +10977,10 @@
 OpenLayers.Projection.transform = function(point, source, dest) {
     if (source.proj && dest.proj) {
         point = Proj4js.transform(source.proj, dest.proj, point);
-    } else if (source && dest && 
-               OpenLayers.Projection.transforms[source.getCode()] && 
+    } else if (source && dest &&
+               OpenLayers.Projection.transforms[source.getCode()] &&
                OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]) {
-        OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point); 
+        OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);
     }
     return point;
 };
@@ -10998,18 +10998,18 @@
 
 /**
  * Class: OpenLayers.Renderer.SVG
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Renderer.Elements>
  */
 OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
 
-    /** 
+    /**
      * Property: xmlns
      * {String}
      */
     xmlns: "http://www.w3.org/2000/svg",
-    
+
     /**
      * Property: xlinkns
      * {String}
@@ -11018,8 +11018,8 @@
 
     /**
      * Constant: MAX_PIXEL
-     * {Integer} Firefox has a limitation where values larger or smaller than  
-     *           about 15000 in an SVG document lock the browser up. This 
+     * {Integer} Firefox has a limitation where values larger or smaller than
+     *           about 15000 in an SVG document lock the browser up. This
      *           works around it.
      */
     MAX_PIXEL: 15000,
@@ -11029,13 +11029,13 @@
      * {Object} Hash with "x" and "y" properties
      */
     translationParameters: null,
-    
+
     /**
      * Property: symbolSize
      * {Object} Cache for symbol sizes according to their svg coordinate space
      */
     symbolSize: {},
-    
+
     /**
      * Property: isGecko
      * {Boolean}
@@ -11052,15 +11052,15 @@
 
     /**
      * Constructor: OpenLayers.Renderer.SVG
-     * 
+     *
      * Parameters:
      * containerID - {String}
      */
     initialize: function(containerID) {
-        if (!this.supported()) { 
-            return; 
+        if (!this.supported()) {
+            return;
         }
-        OpenLayers.Renderer.Elements.prototype.initialize.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
                                                                 arguments);
         this.translationParameters = {x: 0, y: 0};
         this.supportUse = (navigator.userAgent.toLowerCase().indexOf("applewebkit/5") == -1);
@@ -11073,20 +11073,20 @@
     destroy: function() {
         OpenLayers.Renderer.Elements.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: supported
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the SVG renderer
      */
     supported: function() {
         var svgFeature = "http://www.w3.org/TR/SVG11/feature#";
-        return (document.implementation && 
-           (document.implementation.hasFeature("org.w3c.svg", "1.0") || 
-            document.implementation.hasFeature(svgFeature + "SVG", "1.1") || 
+        return (document.implementation &&
+           (document.implementation.hasFeature("org.w3c.svg", "1.0") ||
+            document.implementation.hasFeature(svgFeature + "SVG", "1.1") ||
             document.implementation.hasFeature(svgFeature + "BasicStructure", "1.1") ));
-    },    
+    },
 
     /**
      * Method: inValidRange
@@ -11097,11 +11097,11 @@
      * y      - {Integer}
      * xyOnly - {Boolean} whether or not to just check for x and y, which means
      *     to not take the current translation parameters into account if true.
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the 'x' and 'y' coordinates are in the  
+     * {Boolean} Whether or not the 'x' and 'y' coordinates are in the
      *           valid range.
-     */ 
+     */
     inValidRange: function(x, y, xyOnly) {
         var left = x + (xyOnly ? 0 : this.translationParameters.x);
         var top = y + (xyOnly ? 0 : this.translationParameters.y);
@@ -11111,20 +11111,20 @@
 
     /**
      * Method: setExtent
-     * 
+     *
      * Parameters:
      * extent - {<OpenLayers.Bounds>}
      * resolutionChanged - {Boolean}
-     * 
+     *
      * Returns:
      * {Boolean} true to notify the layer that the new extent does not exceed
      *     the coordinate range, and the features will not need to be redrawn.
      *     False otherwise.
      */
     setExtent: function(extent, resolutionChanged) {
-        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
                                                                arguments);
-        
+
         var resolution = this.getResolution();
         var left = -extent.left / resolution;
         var top = extent.top / resolution;
@@ -11149,15 +11149,15 @@
             return inRange;
         }
     },
-    
+
     /**
      * Method: translate
      * Transforms the SVG coordinate system
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
-     * 
+     *
      * Returns:
      * {Boolean} true if the translation parameters are in the valid coordinates
      *     range, false otherwise.
@@ -11179,24 +11179,24 @@
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>} The size of the drawing surface
      */
     setSize: function(size) {
         OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
-        
+
         this.rendererRoot.setAttributeNS(null, "width", this.size.w);
         this.rendererRoot.setAttributeNS(null, "height", this.size.h);
     },
 
-    /** 
-     * Method: getNodeType 
-     * 
+    /**
+     * Method: getNodeType
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} The corresponding node type for the specified geometry
      */
@@ -11232,17 +11232,17 @@
         return nodeType;
     },
 
-    /** 
+    /**
      * Method: setStyle
      * Use to set all the style attributes to a SVG node.
-     * 
+     *
      * Takes care to adjust stroke width and point radius to be
      * resolution-relative
      *
      * Parameters:
      * node - {SVGDomElement} An SVG element to decorate
      * style - {Object}
-     * options - {Object} Currently supported options include 
+     * options - {Object} Currently supported options include
      *                              'isFilled' {Boolean} and
      *                              'isStroked' {Boolean}
      */
@@ -11258,8 +11258,8 @@
                 node.style.visibility = "hidden";
             } else if (style.externalGraphic) {
                 pos = this.getPosition(node);
-                
-        		if (style.graphicTitle) {
+
+                if (style.graphicTitle) {
                     node.setAttributeNS(null, "title", style.graphicTitle);
                 }
                 if (style.graphicWidth && style.graphicHeight) {
@@ -11275,7 +11275,7 @@
                     style.graphicYOffset : -(0.5 * height);
 
                 var opacity = style.graphicOpacity || style.fillOpacity;
-                
+
                 node.setAttributeNS(null, "x", (pos.x + xOffset).toFixed());
                 node.setAttributeNS(null, "y", (pos.y + yOffset).toFixed());
                 node.setAttributeNS(null, "width", width);
@@ -11289,7 +11289,7 @@
                 var id = this.importSymbol(style.graphicName);
                 pos = this.getPosition(node);
                 widthFactor = this.symbolSize[id] / size;
-                
+
                 // remove the node from the dom before we modify it. This
                 // prevents various rendering issues in Safari and FF
                 var parent = node.parentNode;
@@ -11297,7 +11297,7 @@
                 if(parent) {
                     parent.removeChild(node);
                 }
-                
+
                 if(this.supportUse === false) {
                     // workaround for webkit versions that cannot do defs/use
                     // (see https://bugs.webkit.org/show_bug.cgi?id=33322):
@@ -11313,7 +11313,7 @@
                 node.setAttributeNS(null, "height", size);
                 node.setAttributeNS(null, "x", pos.x - offset);
                 node.setAttributeNS(null, "y", pos.y - offset);
-                
+
                 // now that the node has all its new properties, insert it
                 // back into the dom where it was
                 if(nextSibling) {
@@ -11338,7 +11338,7 @@
                 }
             }
         }
-        
+
         if (options.isFilled) {
             node.setAttributeNS(null, "fill", style.fillColor);
             node.setAttributeNS(null, "fill-opacity", style.fillOpacity);
@@ -11359,25 +11359,25 @@
         } else {
             node.setAttributeNS(null, "stroke", "none");
         }
-        
+
         if (style.pointerEvents) {
             node.setAttributeNS(null, "pointer-events", style.pointerEvents);
         }
-		        
+
         if (style.cursor != null) {
             node.setAttributeNS(null, "cursor", style.cursor);
         }
-        
+
         return node;
     },
 
-    /** 
+    /**
      * Method: dashStyle
-     * 
+     *
      * Parameters:
      * style - {Object}
      * widthFactor - {Number}
-     * 
+     *
      * Returns:
      * {String} A SVG compliant 'stroke-dasharray' value
      */
@@ -11401,14 +11401,14 @@
                 return OpenLayers.String.trim(str).replace(/\s+/g, ",");
         }
     },
-    
-    /** 
+
+    /**
      * Method: createNode
-     * 
+     *
      * Parameters:
      * type - {String} Kind of node to draw
      * id - {String} Id for node
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id
      */
@@ -11417,26 +11417,26 @@
         if (id) {
             node.setAttributeNS(null, "id", id);
         }
-        return node;    
+        return node;
     },
-    
-    /** 
+
+    /**
      * Method: nodeTypeCompare
-     * 
+     *
      * Parameters:
      * node - {SVGDomElement} An SVG element
      * type - {String} Kind of node
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the specified node is of the specified type
      */
     nodeTypeCompare: function(node, type) {
         return (type == node.nodeName);
     },
-   
+
     /**
      * Method: createRenderRoot
-     * 
+     *
      * Returns:
      * {DOMElement} The specific render engine's root element
      */
@@ -11446,10 +11446,10 @@
 
     /**
      * Method: createRoot
-     * 
+     *
      * Parameter:
      * suffix - {String} suffix to append to the id
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -11478,14 +11478,14 @@
     /**
      * Method: drawPoint
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the point
-     */ 
+     */
     drawPoint: function(node, geometry) {
         return this.drawCircle(node, geometry, 1);
     },
@@ -11493,12 +11493,12 @@
     /**
      * Method: drawCircle
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * radius - {Float}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the circle
      */
@@ -11507,73 +11507,73 @@
         var x = (geometry.x / resolution + this.left);
         var y = (this.top - geometry.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             node.setAttributeNS(null, "cx", x);
             node.setAttributeNS(null, "cy", y);
             node.setAttributeNS(null, "r", radius);
             return node;
         } else {
             return false;
-        }    
-            
+        }
+
     },
-    
+
     /**
      * Method: drawLineString
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components of
      *     the linestring, or false if nothing could be drawn
-     */ 
+     */
     drawLineString: function(node, geometry) {
         var componentsResult = this.getComponentsString(geometry.components);
         if (componentsResult.path) {
             node.setAttributeNS(null, "points", componentsResult.path);
-            return (componentsResult.complete ? node : null);  
+            return (componentsResult.complete ? node : null);
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: drawLinearRing
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the linear ring, or false if nothing could be drawn
-     */ 
+     */
     drawLinearRing: function(node, geometry) {
         var componentsResult = this.getComponentsString(geometry.components);
         if (componentsResult.path) {
             node.setAttributeNS(null, "points", componentsResult.path);
-            return (componentsResult.complete ? node : null);  
+            return (componentsResult.complete ? node : null);
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: drawPolygon
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the polygon, or false if nothing could be drawn
-     */ 
+     */
     drawPolygon: function(node, geometry) {
         var d = "";
         var draw = true;
@@ -11598,26 +11598,26 @@
             return complete ? node : null;
         } else {
             return false;
-        }    
+        }
     },
-    
+
     /**
      * Method: drawRectangle
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the rectangle
-     */ 
+     */
     drawRectangle: function(node, geometry) {
         var resolution = this.getResolution();
         var x = (geometry.x / resolution + this.left);
         var y = (this.top - geometry.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             node.setAttributeNS(null, "x", x);
             node.setAttributeNS(null, "y", y);
             node.setAttributeNS(null, "width", geometry.width / resolution);
@@ -11627,18 +11627,18 @@
             return false;
         }
     },
-    
+
     /**
      * Method: drawSurface
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the surface
-     */ 
+     */
     drawSurface: function(node, geometry) {
 
         // create the svg path string representation
@@ -11665,30 +11665,30 @@
             return node;
         } else {
             return false;
-        }    
+        }
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
      */
     drawText: function(featureId, style, location) {
         var resolution = this.getResolution();
-        
+
         var x = (location.x / resolution + this.left);
         var y = (location.y / resolution - this.top);
-        
+
         var label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, "text");
         var tspan = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_tspan", "tspan");
 
         label.setAttributeNS(null, "x", x);
         label.setAttributeNS(null, "y", -y);
-        
+
         if (style.fontColor) {
             label.setAttributeNS(null, "fill", style.fontColor);
         }
@@ -11723,20 +11723,20 @@
         }
 
         tspan.textContent = style.label;
-        
+
         if(!label.parentNode) {
             label.appendChild(tspan);
             this.textRoot.appendChild(label);
-        }   
+        }
     },
-    
-    /** 
+
+    /**
      * Method: getComponentString
-     * 
+     *
      * Parameters:
      * components - {Array(<OpenLayers.Geometry.Point>)} Array of points
      * separator - {String} character between coordinate pairs. Defaults to ","
-     * 
+     *
      * Returns:
      * {Object} hash with properties "path" (the string created from the
      *     components and "complete" (false if the renderer was unable to
@@ -11780,13 +11780,13 @@
             complete: complete
         };
     },
-    
+
     /**
      * Method: clipLine
      * Given two points (one inside the valid range, and one outside),
      * clips the line betweeen the two points so that the new points are both
      * inside the valid range.
-     * 
+     *
      * Parameters:
      * badComponent - {<OpenLayers.Geometry.Point>)} original geometry of the
      *     invalid point
@@ -11822,12 +11822,12 @@
         return x2 + "," + y2;
     },
 
-    /** 
+    /**
      * Method: getShortString
-     * 
+     *
      * Parameters:
      * point - {<OpenLayers.Geometry.Point>}
-     * 
+     *
      * Returns:
      * {String} or false if point is outside the valid range
      */
@@ -11836,20 +11836,20 @@
         var x = (point.x / resolution + this.left);
         var y = (this.top - point.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             return x + "," + y;
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: getPosition
      * Finds the position of an svg node.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
-     * 
+     *
      * Returns:
      * {Object} hash with x and y properties, representing the coordinates
      *     within the svg coordinate system
@@ -11864,25 +11864,25 @@
     /**
      * Method: importSymbol
      * add a new symbol definition from the rendererer's symbol hash
-     * 
+     *
      * Parameters:
      * graphicName - {String} name of the symbol to import
-     * 
+     *
      * Returns:
      * {String} - id of the imported symbol
-     */      
+     */
     importSymbol: function (graphicName)  {
         if (!this.defs) {
             // create svg defs tag
             this.defs = this.createDefs();
         }
         var id = this.container.id + "-" + graphicName;
-        
+
         // check if symbol already exists in the defs
         if (document.getElementById(id) != null) {
             return id;
         }
-        
+
         var symbol = OpenLayers.Renderer.symbol[graphicName];
         if (!symbol) {
             throw new Error(graphicName + ' is not a valid symbol name');
@@ -11906,9 +11906,9 @@
             symbolExtent.top = Math.max(symbolExtent.top, y);
             points += " " + x + "," + y;
         }
-        
+
         node.setAttributeNS(null, "points", points);
-        
+
         var width = symbolExtent.getWidth();
         var height = symbolExtent.getHeight();
         // create a viewBox three times as large as the symbol itself,
@@ -11917,19 +11917,19 @@
                         symbolExtent.bottom - height, width * 3, height * 3];
         symbolNode.setAttributeNS(null, "viewBox", viewBox.join(" "));
         this.symbolSize[id] = Math.max(width, height) * 3;
-        
+
         this.defs.appendChild(symbolNode);
         return symbolNode.id;
     },
-    
+
     /**
      * Method: getFeatureIdFromEvent
-     * 
+     *
      * Parameters:
      * evt - {Object} An <OpenLayers.Event> object
      *
      * Returns:
-     * {<OpenLayers.Geometry>} A geometry from an event that 
+     * {<OpenLayers.Geometry>} A geometry from an event that
      *     happened on a layer.
      */
     getFeatureIdFromEvent: function(evt) {
@@ -11967,7 +11967,7 @@
     // bottom to the top of the baseline, so -35% moves the text to
     // the center of the baseline.
     "t": "-70%",
-    "b": "0"    
+    "b": "0"
 };
 /* ======================================================================
     OpenLayers/Renderer/VML.js
@@ -11985,9 +11985,9 @@
  * Class: OpenLayers.Renderer.VML
  * Render vector features in browsers with VML capability.  Construct a new
  * VML renderer with the <OpenLayers.Renderer.VML> constructor.
- * 
- * Note that for all calculations in this class, we use toFixed() to round a 
- * float value to an integer. This is done because it seems that VML doesn't 
+ *
+ * Note that for all calculations in this class, we use toFixed() to round a
+ * float value to an integer. This is done because it seems that VML doesn't
  * support float values.
  *
  * Inherits from:
@@ -12000,7 +12000,7 @@
      * {String} XML Namespace URN
      */
     xmlns: "urn:schemas-microsoft-com:vml",
-    
+
     /**
      * Property: symbolCache
      * {DOMElement} node holding symbols. This hash is keyed by symbol name,
@@ -12013,7 +12013,7 @@
      * {Object} Hash with "x" and "y" properties
      */
     offset: null,
-    
+
     /**
      * Constructor: OpenLayers.Renderer.VML
      * Create a new VML renderer.
@@ -12022,21 +12022,21 @@
      * containerID - {String} The id for the element that contains the renderer
      */
     initialize: function(containerID) {
-        if (!this.supported()) { 
-            return; 
+        if (!this.supported()) {
+            return;
         }
         if (!document.namespaces.olv) {
             document.namespaces.add("olv", this.xmlns);
             var style = document.createStyleSheet();
-            var shapes = ['shape','rect', 'oval', 'fill', 'stroke', 'imagedata', 'group','textbox']; 
+            var shapes = ['shape','rect', 'oval', 'fill', 'stroke', 'imagedata', 'group','textbox'];
             for (var i = 0, len = shapes.length; i < len; i++) {
 
                 style.addRule('olv\\:' + shapes[i], "behavior: url(#default#VML); " +
                               "position: absolute; display: inline-block;");
-            }                  
+            }
         }
-        
-        OpenLayers.Renderer.Elements.prototype.initialize.apply(this, 
+
+        OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
                                                                 arguments);
         this.offset = {x: 0, y: 0};
     },
@@ -12058,7 +12058,7 @@
      */
     supported: function() {
         return !!(document.namespaces);
-    },    
+    },
 
     /**
      * Method: setExtent
@@ -12067,16 +12067,16 @@
      * Parameters:
      * extent - {<OpenLayers.Bounds>}
      * resolutionChanged - {Boolean}
-     * 
+     *
      * Returns:
      * {Boolean} true to notify the layer that the new extent does not exceed
      *     the coordinate range, and the features will not need to be redrawn.
      */
     setExtent: function(extent, resolutionChanged) {
-        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
                                                                arguments);
         var resolution = this.getResolution();
-    
+
         var left = extent.left/resolution;
         var top = extent.top/resolution - this.size.h;
         if (resolutionChanged) {
@@ -12088,7 +12088,7 @@
             top = top - this.offset.y;
         }
 
-        
+
         var org = left + " " + top;
         this.root.coordorigin = org;
         var roots = [this.root, this.vectorRoot, this.textRoot];
@@ -12098,12 +12098,12 @@
 
             var size = this.size.w + " " + this.size.h;
             root.coordsize = size;
-            
+
         }
-        // flip the VML display Y axis upside down so it 
+        // flip the VML display Y axis upside down so it
         // matches the display Y axis of the map
         this.root.style.flip = "y";
-        
+
         return true;
     },
 
@@ -12117,7 +12117,7 @@
      */
     setSize: function(size) {
         OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
-        
+
         // setting width and height on all roots to avoid flicker which we
         // would get with 100% width and height on child roots
         var roots = [
@@ -12182,7 +12182,7 @@
      * Parameters:
      * node - {DOMElement} An VML element to decorate
      * style - {Object}
-     * options - {Object} Currently supported options include 
+     * options - {Object} Currently supported options include
      *                              'isFilled' {Boolean} and
      *                              'isStroked' {Boolean}
      * geometry - {<OpenLayers.Geometry>}
@@ -12191,12 +12191,12 @@
         style = style  || node._style;
         options = options || node._options;
         var widthFactor = 1;
-        
+
         if (node._geometryClass == "OpenLayers.Geometry.Point") {
             if (style.externalGraphic) {
-        		if (style.graphicTitle) {
+                if (style.graphicTitle) {
                     node.title=style.graphicTitle;
-                } 
+                }
                 var width = style.graphicWidth || style.graphicHeight;
                 var height = style.graphicHeight || style.graphicWidth;
                 width = width ? width : style.pointRadius*2;
@@ -12207,13 +12207,13 @@
                     style.graphicXOffset : -(0.5 * width);
                 var yOffset = (style.graphicYOffset != undefined) ?
                     style.graphicYOffset : -(0.5 * height);
-                
+
                 node.style.left = ((geometry.x/resolution - this.offset.x)+xOffset).toFixed();
                 node.style.top = ((geometry.y/resolution - this.offset.y)-(yOffset+height)).toFixed();
                 node.style.width = width + "px";
                 node.style.height = height + "px";
                 node.style.flip = "y";
-                
+
                 // modify style/options for fill and stroke styling below
                 style.fillColor = "none";
                 options.isStroked = false;
@@ -12222,7 +12222,7 @@
                 node.path = cache.path;
                 node.coordorigin = cache.left + "," + cache.bottom;
                 var size = cache.size;
-                node.coordsize = size + "," + size;        
+                node.coordsize = size + "," + size;
                 this.drawCircle(node, geometry, style.pointRadius);
                 node.style.flip = "y";
             } else {
@@ -12230,11 +12230,11 @@
             }
         }
 
-        // fill 
-        if (options.isFilled) { 
-            node.fillcolor = style.fillColor; 
-        } else { 
-            node.filled = "false"; 
+        // fill
+        if (options.isFilled) {
+            node.fillcolor = style.fillColor;
+        } else {
+            node.filled = "false";
         }
         var fills = node.getElementsByTagName("fill");
         var fill = (fills.length == 0) ? null : fills[0];
@@ -12255,13 +12255,13 @@
                 if (style.graphicOpacity) {
                     fill.opacity = style.graphicOpacity;
                 }
-                
+
                 fill.src = style.externalGraphic;
                 fill.type = "frame";
-                
+
                 if (!(style.graphicWidth && style.graphicHeight)) {
                   fill.aspect = "atmost";
-                }                
+                }
             }
             if (fill.parentNode != node) {
                 node.appendChild(fill);
@@ -12282,12 +12282,12 @@
             }
         }
 
-        // stroke 
-        if (options.isStroked) { 
-            node.strokecolor = style.strokeColor; 
-            node.strokeweight = style.strokeWidth + "px"; 
-        } else { 
-            node.stroked = false; 
+        // stroke
+        if (options.isStroked) {
+            node.strokecolor = style.strokeColor;
+            node.strokeweight = style.strokeWidth + "px";
+        } else {
+            node.stroked = false;
         }
         var strokes = node.getElementsByTagName("stroke");
         var stroke = (strokes.length == 0) ? null : strokes[0];
@@ -12304,7 +12304,7 @@
             stroke.endcap = !style.strokeLinecap || style.strokeLinecap == 'butt' ? 'flat' : style.strokeLinecap;
             stroke.dashstyle = this.dashStyle(style);
         }
-        
+
         if (style.cursor != "inherit" && style.cursor != null) {
             node.style.cursor = style.cursor;
         }
@@ -12324,7 +12324,7 @@
      * insertion point of the rotated image, because DXImageTransform.Matrix
      * does the rotation without the ability to specify a rotation center
      * point.
-     * 
+     *
      * Parameters:
      * node    - {DOMElement}
      * xOffset - {Number} rotation center relative to image, x coordinate
@@ -12333,7 +12333,7 @@
     graphicRotate: function(node, xOffset, yOffset) {
         var style = style || node._style;
         var options = node._options;
-        
+
         var aspectRatio, size;
         if (!(style.graphicWidth && style.graphicHeight)) {
             // load the image to determine its size
@@ -12342,7 +12342,7 @@
                 if(img.readyState == "complete" ||
                         img.readyState == "interactive") {
                     aspectRatio = img.width / img.height;
-                    size = Math.max(style.pointRadius * 2, 
+                    size = Math.max(style.pointRadius * 2,
                         style.graphicWidth || 0,
                         style.graphicHeight || 0);
                     xOffset = xOffset * aspectRatio;
@@ -12352,19 +12352,19 @@
                 }
             }, this);
             img.src = style.externalGraphic;
-            
+
             // will be called again by the onreadystate handler
             return;
         } else {
             size = Math.max(style.graphicWidth, style.graphicHeight);
             aspectRatio = style.graphicWidth / style.graphicHeight;
         }
-        
+
         var width = Math.round(style.graphicWidth || size * aspectRatio);
         var height = Math.round(style.graphicHeight || size);
         node.style.width = width + "px";
         node.style.height = height + "px";
-        
+
         // Three steps are required to remove artefacts for images with
         // transparent backgrounds (resulting from using DXImageTransform
         // filters on svg objects), while preserving awareness for browser
@@ -12383,7 +12383,7 @@
         image.style.height = height + "px";
         image.src = style.externalGraphic;
         image.style.filter =
-            "progid:DXImageTransform.Microsoft.AlphaImageLoader(" + 
+            "progid:DXImageTransform.Microsoft.AlphaImageLoader(" +
             "src='', sizingMethod='scale')";
 
         var rotation = style.rotation * Math.PI / 180;
@@ -12399,8 +12399,8 @@
         // set the opacity (needed for the imagedata)
         var opacity = style.graphicOpacity || style.fillOpacity;
         if (opacity && opacity != 1) {
-            filter += 
-                "progid:DXImageTransform.Microsoft.BasicImage(opacity=" + 
+            filter +=
+                "progid:DXImageTransform.Microsoft.BasicImage(opacity=" +
                 opacity+")\n";
         }
         node.style.filter = filter;
@@ -12423,7 +12423,7 @@
      * and strokecolor to "none" correctly before the fill node is appended to
      * a visible vml node. This method takes care of that and sets fillcolor
      * and strokecolor again if needed.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      */
@@ -12443,9 +12443,9 @@
 
     /**
      * Method: setNodeDimension
-     * Get the geometry's bounds, convert it to our vml coordinate system, 
+     * Get the geometry's bounds, convert it to our vml coordinate system,
      * then set the node's position, size, and local coordinate system.
-     *   
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
@@ -12455,30 +12455,30 @@
         var bbox = geometry.getBounds();
         if(bbox) {
             var resolution = this.getResolution();
-        
-            var scaledBox = 
+
+            var scaledBox =
                 new OpenLayers.Bounds((bbox.left/resolution - this.offset.x).toFixed(),
                                       (bbox.bottom/resolution - this.offset.y).toFixed(),
                                       (bbox.right/resolution - this.offset.x).toFixed(),
                                       (bbox.top/resolution - this.offset.y).toFixed());
-            
+
             // Set the internal coordinate system to draw the path
             node.style.left = scaledBox.left + "px";
             node.style.top = scaledBox.top + "px";
             node.style.width = scaledBox.getWidth() + "px";
             node.style.height = scaledBox.getHeight() + "px";
-    
+
             node.coordorigin = scaledBox.left + " " + scaledBox.top;
             node.coordsize = scaledBox.getWidth()+ " " + scaledBox.getHeight();
         }
     },
-    
-    /** 
+
+    /**
      * Method: dashStyle
-     * 
+     *
      * Parameters:
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} A VML compliant 'stroke-dasharray' value
      */
@@ -12524,15 +12524,15 @@
         if (id) {
             node.id = id;
         }
-        
+
         // IE hack to make elements unselectable, to prevent 'blue flash'
         // while dragging vectors; #1410
         node.unselectable = 'on';
         node.onselectstart = function() { return(false); };
-        
-        return node;    
+
+        return node;
     },
-    
+
     /**
      * Method: nodeTypeCompare
      * Determine whether a node is of a given type
@@ -12577,7 +12577,7 @@
     /**
      * Method: createRoot
      * Create the main root element
-     * 
+     *
      * Parameters:
      * suffix - {String} suffix to append to the id
      *
@@ -12587,21 +12587,21 @@
     createRoot: function(suffix) {
         return this.nodeFactory(this.container.id + suffix, "olv:group");
     },
-    
+
     /**************************************
      *                                    *
      *     GEOMETRY DRAWING FUNCTIONS     *
      *                                    *
      **************************************/
-    
+
     /**
      * Method: drawPoint
      * Render a point
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the point could not be drawn
      */
@@ -12613,12 +12613,12 @@
      * Method: drawCircle
      * Render a circle.
      * Size and Center a circle given geometry (x,y center) and radius
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * radius - {float}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the circle could not ne drawn
      */
@@ -12628,9 +12628,9 @@
 
             node.style.left = ((geometry.x /resolution - this.offset.x).toFixed() - radius) + "px";
             node.style.top = ((geometry.y /resolution - this.offset.y).toFixed() - radius) + "px";
-    
+
             var diameter = radius * 2;
-            
+
             node.style.width = diameter + "px";
             node.style.height = diameter + "px";
             return node;
@@ -12642,11 +12642,11 @@
     /**
      * Method: drawLineString
      * Render a linestring.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12657,11 +12657,11 @@
     /**
      * Method: drawLinearRing
      * Render a linearring
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12672,12 +12672,12 @@
     /**
      * Method: DrawLine
      * Render a line.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * closeLine - {Boolean} Close the line? (make it a ring?)
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12704,11 +12704,11 @@
     /**
      * Method: drawPolygon
      * Render a polygon
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12716,7 +12716,7 @@
         this.setNodeDimension(node, geometry);
 
         var resolution = this.getResolution();
-    
+
         var path = [];
         var linearRing, i, j, len, ilen, comp, x, y;
         for (j = 0, len=geometry.components.length; j<len; j++) {
@@ -12742,30 +12742,30 @@
     /**
      * Method: drawRectangle
      * Render a rectangle
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
     drawRectangle: function(node, geometry) {
         var resolution = this.getResolution();
-    
+
         node.style.left = (geometry.x/resolution - this.offset.x) + "px";
         node.style.top = (geometry.y/resolution - this.offset.y) + "px";
         node.style.width = geometry.width/resolution + "px";
         node.style.height = geometry.height/resolution + "px";
-        
+
         return node;
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
@@ -12773,7 +12773,7 @@
     drawText: function(featureId, style, location) {
         var label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, "olv:rect");
         var textbox = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox");
-        
+
         var resolution = this.getResolution();
         label.style.left = (location.x/resolution - this.offset.x).toFixed() + "px";
         label.style.top = (location.y/resolution - this.offset.y).toFixed() + "px";
@@ -12815,11 +12815,11 @@
 
     /**
      * Method: drawSurface
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12828,7 +12828,7 @@
         this.setNodeDimension(node, geometry);
 
         var resolution = this.getResolution();
-    
+
         var path = [];
         var comp, x, y;
         for (var i=0, len=geometry.components.length; i<len; i++) {
@@ -12847,17 +12847,17 @@
         node.path = path.join("");
         return node;
     },
-    
+
     /**
      * Method: moveRoot
      * moves this renderer's root to a different renderer.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      * root - {DOMElement} optional root node. To be used when this renderer
      *     holds roots from multiple layers to tell this method which one to
      *     detach
-     * 
+     *
      * Returns:
      * {Boolean} true if successful, false otherwise
      */
@@ -12870,26 +12870,26 @@
         OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this, arguments);
         layer && layer.redraw();
     },
-    
+
     /**
      * Method: importSymbol
      * add a new symbol definition from the rendererer's symbol hash
-     * 
+     *
      * Parameters:
      * graphicName - {String} name of the symbol to import
-     * 
+     *
      * Returns:
      * {Object} - hash of {DOMElement} "symbol" and {Number} "size"
-     */      
+     */
     importSymbol: function (graphicName)  {
         var id = this.container.id + "-" + graphicName;
-        
+
         // check if symbol already exists in the cache
         var cache = this.symbolCache[id];
         if (cache) {
             return cache;
         }
-        
+
         var symbol = OpenLayers.Renderer.symbol[graphicName];
         if (!symbol) {
             throw new Error(graphicName + ' is not a valid symbol name');
@@ -12898,7 +12898,7 @@
 
         var symbolExtent = new OpenLayers.Bounds(
                                     Number.MAX_VALUE, Number.MAX_VALUE, 0, 0);
-        
+
         var pathitems = ["m"];
         for (var i=0; i<symbol.length; i=i+2) {
             x = symbol[i];
@@ -12925,7 +12925,7 @@
             symbolExtent.left = symbolExtent.left - diff;
             symbolExtent.right = symbolExtent.right + diff;
         }
-        
+
         cache = {
             path: path,
             size: symbolExtent.getWidth(), // equals getHeight() now
@@ -12933,10 +12933,10 @@
             bottom: symbolExtent.bottom
         };
         this.symbolCache[id] = cache;
-        
+
         return cache;
     },
-    
+
     CLASS_NAME: "OpenLayers.Renderer.VML"
 });
 
@@ -12967,70 +12967,70 @@
  */
 
 /*
- * Class: OpenLayers.Tile 
+ * Class: OpenLayers.Tile
  * This is a class designed to designate a single tile, however
- *     it is explicitly designed to do relatively little. Tiles store 
+ *     it is explicitly designed to do relatively little. Tiles store
  *     information about themselves -- such as the URL that they are related
- *     to, and their size - but do not add themselves to the layer div 
- *     automatically, for example. Create a new tile with the 
- *     <OpenLayers.Tile> constructor, or a subclass. 
- * 
+ *     to, and their size - but do not add themselves to the layer div
+ *     automatically, for example. Create a new tile with the
+ *     <OpenLayers.Tile> constructor, or a subclass.
+ *
  * TBD 3.0 - remove reference to url in above paragraph
- * 
+ *
  */
 OpenLayers.Tile = OpenLayers.Class({
-    
-    /** 
+
+    /**
      * Constant: EVENT_TYPES
      * {Array(String)} Supported application event types
      */
     EVENT_TYPES: [ "loadstart", "loadend", "reload", "unload"],
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *                       events on the tile.
      */
     events: null,
 
     /**
-     * Property: id 
+     * Property: id
      * {String} null
      */
     id: null,
-    
-    /** 
-     * Property: layer 
-     * {<OpenLayers.Layer>} layer the tile is attached to 
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer>} layer the tile is attached to
      */
     layer: null,
-    
+
     /**
      * Property: url
      * {String} url of the request.
      *
-     * TBD 3.0 
-     * Deprecated. The base tile class does not need an url. This should be 
+     * TBD 3.0
+     * Deprecated. The base tile class does not need an url. This should be
      * handled in subclasses. Does not belong here.
      */
     url: null,
 
-    /** 
-     * APIProperty: bounds 
+    /**
+     * APIProperty: bounds
      * {<OpenLayers.Bounds>} null
      */
     bounds: null,
-    
-    /** 
-     * Property: size 
+
+    /**
+     * Property: size
      * {<OpenLayers.Size>} null
      */
     size: null,
-    
-    /** 
-     * Property: position 
+
+    /**
+     * Property: position
      * {<OpenLayers.Pixel>} Top Left pixel of the tile
-     */    
+     */
     position: null,
 
     /**
@@ -13038,20 +13038,20 @@
      * {Boolean} Is the tile loading?
      */
     isLoading: false,
-        
+
     /** TBD 3.0 -- remove 'url' from the list of parameters to the constructor.
      *             there is no need for the base tile class to have a url.
-     * 
+     *
      * Constructor: OpenLayers.Tile
      * Constructor for a new <OpenLayers.Tile> instance.
-     * 
+     *
      * Parameters:
      * layer - {<OpenLayers.Layer>} layer that the tile will go in.
      * position - {<OpenLayers.Pixel>}
      * bounds - {<OpenLayers.Bounds>}
      * url - {<String>}
      * size - {<OpenLayers.Size>}
-     */   
+     */
     initialize: function(layer, position, bounds, url, size) {
         this.layer = layer;
         this.position = position.clone();
@@ -13061,7 +13061,7 @@
 
         //give the tile a unique id based on its BBOX.
         this.id = OpenLayers.Util.createUniqueID("Tile_");
-        
+
         this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES);
     },
 
@@ -13073,13 +13073,13 @@
      * still loading.
      */
     unload: function() {
-       if (this.isLoading) { 
-           this.isLoading = false; 
-           this.events.triggerEvent("unload"); 
+       if (this.isLoading) {
+           this.isLoading = false;
+           this.events.triggerEvent("unload");
        }
     },
-    
-    /** 
+
+    /**
      * APIMethod: destroy
      * Nullify references to prevent circular references and memory leaks.
      */
@@ -13088,11 +13088,11 @@
         this.bounds = null;
         this.size = null;
         this.position = null;
-        
+
         this.events.destroy();
         this.events = null;
     },
-    
+
     /**
      * Method: clone
      *
@@ -13104,27 +13104,27 @@
      */
     clone: function (obj) {
         if (obj == null) {
-            obj = new OpenLayers.Tile(this.layer, 
-                                      this.position, 
-                                      this.bounds, 
-                                      this.url, 
+            obj = new OpenLayers.Tile(this.layer,
+                                      this.position,
+                                      this.bounds,
+                                      this.url,
                                       this.size);
-        } 
-        
+        }
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(obj, this);
-        
+
         return obj;
     },
 
     /**
      * Method: draw
-     * Clear whatever is currently in the tile, then return whether or not 
+     * Clear whatever is currently in the tile, then return whether or not
      *     it should actually be re-drawn.
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the tile should actually be drawn. Note that 
-     *     this is not really the best way of doing things, but such is 
+     * {Boolean} Whether or not the tile should actually be drawn. Note that
+     *     this is not really the best way of doing things, but such is
      *     the way the code has been developed. Subclasses call this and
      *     depend on the return to know if they should draw or not.
      */
@@ -13132,18 +13132,18 @@
         var maxExtent = this.layer.maxExtent;
         var withinMaxExtent = (maxExtent &&
                                this.bounds.intersectsBounds(maxExtent, false));
- 
-        // The only case where we *wouldn't* want to draw the tile is if the 
+
+        // The only case where we *wouldn't* want to draw the tile is if the
         // tile is outside its layer's maxExtent.
         this.shouldDraw = (withinMaxExtent || this.layer.displayOutsideMaxExtent);
-                
+
         //clear tile's contents and mark as not drawn
         this.clear();
-        
+
         return this.shouldDraw;
     },
-    
-    /** 
+
+    /**
      * Method: moveTo
      * Reposition the tile.
      *
@@ -13165,75 +13165,75 @@
         }
     },
 
-    /** 
+    /**
      * Method: clear
-     * Clear the tile of any bounds/position-related data so that it can 
+     * Clear the tile of any bounds/position-related data so that it can
      *     be reused in a new location. To be implemented by subclasses.
      */
     clear: function() {
         // to be implemented by subclasses
     },
-    
-    /**   
+
+    /**
      * Method: getBoundsFromBaseLayer
-     * Take the pixel locations of the corner of the tile, and pass them to 
-     *     the base layer and ask for the location of those pixels, so that 
+     * Take the pixel locations of the corner of the tile, and pass them to
+     *     the base layer and ask for the location of those pixels, so that
      *     displaying tiles over Google works fine.
      *
      * Parameters:
      * position - {<OpenLayers.Pixel>}
      *
      * Returns:
-     * bounds - {<OpenLayers.Bounds>} 
+     * bounds - {<OpenLayers.Bounds>}
      */
     getBoundsFromBaseLayer: function(position) {
         var msg = OpenLayers.i18n('reprojectDeprecated',
                                               {'layerName':this.layer.name});
         OpenLayers.Console.warn(msg);
-        var topLeft = this.layer.map.getLonLatFromLayerPx(position); 
+        var topLeft = this.layer.map.getLonLatFromLayerPx(position);
         var bottomRightPx = position.clone();
         bottomRightPx.x += this.size.w;
         bottomRightPx.y += this.size.h;
-        var bottomRight = this.layer.map.getLonLatFromLayerPx(bottomRightPx); 
+        var bottomRight = this.layer.map.getLonLatFromLayerPx(bottomRightPx);
         // Handle the case where the base layer wraps around the date line.
-        // Google does this, and it breaks WMS servers to request bounds in 
-        // that fashion.  
+        // Google does this, and it breaks WMS servers to request bounds in
+        // that fashion.
         if (topLeft.lon > bottomRight.lon) {
             if (topLeft.lon < 0) {
                 topLeft.lon = -180 - (topLeft.lon+180);
             } else {
                 bottomRight.lon = 180+bottomRight.lon+180;
-            }        
+            }
         }
-        var bounds = new OpenLayers.Bounds(topLeft.lon, 
-                                       bottomRight.lat, 
-                                       bottomRight.lon, 
-                                       topLeft.lat);  
+        var bounds = new OpenLayers.Bounds(topLeft.lon,
+                                       bottomRight.lat,
+                                       bottomRight.lon,
+                                       topLeft.lat);
         return bounds;
-    },        
-        
-    /** 
+    },
+
+    /**
      * Method: showTile
      * Show the tile only if it should be drawn.
      */
-    showTile: function() { 
+    showTile: function() {
         if (this.shouldDraw) {
             this.show();
         }
     },
-    
-    /** 
+
+    /**
      * Method: show
      * Show the tile.  To be implemented by subclasses.
      */
     show: function() { },
-    
-    /** 
+
+    /**
      * Method: hide
      * Hide the tile.  To be implemented by subclasses.
      */
     hide: function() { },
-    
+
     CLASS_NAME: "OpenLayers.Tile"
 });
 /* ======================================================================
@@ -13260,7 +13260,7 @@
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
-    
+
     /**
      * Property: namespaces
      * {Object} Mapping of namespace aliases to namespace URIs.  Properties
@@ -13269,20 +13269,20 @@
      *     <setNamespace> to add or set a namespace alias after construction.
      */
     namespaces: null,
-    
+
     /**
      * Property: namespaceAlias
      * {Object} Mapping of namespace URI to namespace alias.  This object
      *     is read-only.  Use <setNamespace> to add or set a namespace alias.
      */
     namespaceAlias: null,
-    
+
     /**
      * Property: defaultPrefix
      * {String} The default namespace alias for creating element nodes.
      */
     defaultPrefix: null,
-    
+
     /**
      * Property: readers
      * Contains public functions, grouped by namespace prefix, that will
@@ -13292,7 +13292,7 @@
      *     from the parent.
      */
     readers: {},
-    
+
     /**
      * Property: writers
      * As a compliment to the <readers> property, this structure contains public
@@ -13333,7 +13333,7 @@
             this.namespaceAlias[this.namespaces[alias]] = alias;
         }
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up.
@@ -13342,7 +13342,7 @@
         this.xmldom = null;
         OpenLayers.Format.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: setNamespace
      * Set a namespace alias and URI for the format.
@@ -13362,7 +13362,7 @@
      *
      * Parameters:
      * text - {String} A XML string
-     
+
      * Returns:
      * {DOMElement} A DOM node
      */
@@ -13383,7 +13383,7 @@
                         xmldom = new ActiveXObject("Microsoft.XMLDOM");
                     } else {
                         xmldom = this.xmldom;
-                        
+
                     }
                     xmldom.loadXML(text);
                     return xmldom;
@@ -13414,7 +13414,7 @@
     /**
      * APIMethod: write
      * Serialize a DOM node into a XML string.
-     * 
+     *
      * Parameters:
      * node - {DOMElement} A DOM node.
      *
@@ -13453,7 +13453,7 @@
      * Parameters:
      * uri - {String} Namespace URI for the element.
      * name - {String} The qualified name of the element (prefix:localname).
-     * 
+     *
      * Returns:
      * {Element} A DOM element with namespace.
      */
@@ -13476,11 +13476,11 @@
      * Create a text node.  This node can be appended to another node with
      *     the standard node.appendChild method.  For cross-browser support,
      *     this method must be used instead of document.createTextNode.
-     * 
+     *
      * Parameters:
      * text - {String} The text of the node.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {DOMElement} A DOM text node.
      */
     createTextNode: function(text) {
@@ -13499,12 +13499,12 @@
      *     To return all nodes in a given namespace, use '*' for the name
      *     argument.  To return all nodes of a given (local) name, regardless
      *     of namespace, use '*' for the uri argument.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for other nodes.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the tag (without the prefix).
-     * 
+     *
      * Returns:
      * {NodeList} A node list or array of elements.
      */
@@ -13533,12 +13533,12 @@
     /**
      * APIMethod: getAttributeNodeNS
      * Get an attribute node given the namespace URI and local name.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for attribute nodes.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {DOMElement} An attribute node or null if none found.
      */
@@ -13567,12 +13567,12 @@
     /**
      * APIMethod: getAttributeNS
      * Get an attribute value given the namespace URI and local name.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for an attribute.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {String} An attribute value or and empty string if none found.
      */
@@ -13588,7 +13588,7 @@
         }
         return attributeValue;
     },
-    
+
     /**
      * APIMethod: getChildValue
      * Get the textual value of the node if it exists, or return an
@@ -13650,7 +13650,7 @@
         }
         return value;
     },
-    
+
     /**
      * APIMethod: isSimpleContent
      * Test if the given node has only simple content (i.e. no child element
@@ -13660,7 +13660,7 @@
      * node - {DOMElement} An element node.
      *
      * Returns:
-     * {Boolean} The node has no child element nodes (nodes of type 1). 
+     * {Boolean} The node has no child element nodes (nodes of type 1).
      */
     isSimpleContent: function(node) {
         var simple = true;
@@ -13672,7 +13672,7 @@
         }
         return simple;
     },
-    
+
     /**
      * APIMethod: contentType
      * Determine the content type for a given node.
@@ -13687,7 +13687,7 @@
     contentType: function(node) {
         var simple = false,
             complex = false;
-            
+
         var type = OpenLayers.Format.XML.CONTENT_TYPE.EMPTY;
 
         for(var child=node.firstChild; child; child=child.nextSibling) {
@@ -13704,7 +13704,7 @@
                 break;
             }
         }
-        
+
         if(complex && simple) {
             type = OpenLayers.Format.XML.CONTENT_TYPE.MIXED;
         } else if(complex) {
@@ -13719,12 +13719,12 @@
      * APIMethod: hasAttributeNS
      * Determine whether a node has a particular attribute matching the given
      *     name and namespace.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for an attribute.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {Boolean} The node has an attribute matching the name and namespace.
      */
@@ -13737,7 +13737,7 @@
         }
         return found;
     },
-    
+
     /**
      * APIMethod: setAttributeNS
      * Adds a new attribute or changes the value of an attribute with the given
@@ -13817,7 +13817,7 @@
         }
         return node;
     },
-    
+
     /**
      * Method: setAttributes
      * Set multiple attributes given key value pairs from an object.
@@ -13956,7 +13956,7 @@
     getChildEl: function(node, name, uri) {
         return node && this.getThisOrNextEl(node.firstChild, name, uri);
     },
-    
+
     /**
      * APIMethod: getNextEl
      * Get the next sibling element.  Optionally get the first sibling only
@@ -13975,7 +13975,7 @@
     getNextEl: function(node, name, uri) {
         return node && this.getThisOrNextEl(node.nextSibling, name, uri);
     },
-    
+
     /**
      * Method: getThisOrNextEl
      * Return this node or the next element node.  Optionally get the first
@@ -14017,7 +14017,7 @@
         }
         return sibling || null;
     },
-    
+
     /**
      * APIMethod: lookupNamespaceURI
      * Takes a prefix and returns the namespace URI associated with it on the given
@@ -14030,11 +14030,11 @@
      *
      * For browsers that don't support the attribute.ownerElement property, this
      *     method cannot be called on attribute nodes.
-     *     
+     *
      * Parameters:
      * node - {DOMElement} The node from which to start looking.
      * prefix - {String} The prefix to lookup or null to lookup the default namespace.
-     * 
+     *
      * Returns:
      * {String} The namespace URI for the given prefix.  Returns null if the prefix
      *     cannot be found or the node is the wrong type.
@@ -14078,7 +14078,7 @@
                     case 10: // DOCUMENT_TYPE_NODE
                     case 11: // DOCUMENT_FRAGMENT_NODE
                         break outer;
-                    default: 
+                    default:
                         // TEXT_NODE (3), CDATA_SECTION_NODE (4), ENTITY_REFERENCE_NODE (5),
                         // PROCESSING_INSTRUCTION_NODE (7), COMMENT_NODE (8)
                         uri =  this.lookupNamespaceURI(node.parentNode, prefix);
@@ -14088,11 +14088,11 @@
         }
         return uri;
     },
-    
-    CLASS_NAME: "OpenLayers.Format.XML" 
 
-});     
+    CLASS_NAME: "OpenLayers.Format.XML"
 
+});
+
 OpenLayers.Format.XML.CONTENT_TYPE = {EMPTY: 0, SIMPLE: 1, COMPLEX: 2, MIXED: 3};
 
 /**
@@ -14107,11 +14107,11 @@
  *
  * For browsers that don't support the attribute.ownerElement property, this
  *     method cannot be called on attribute nodes.
- *     
+ *
  * Parameters:
  * node - {DOMElement} The node from which to start looking.
  * prefix - {String} The prefix to lookup or null to lookup the default namespace.
- * 
+ *
  * Returns:
  * {String} The namespace URI for the given prefix.  Returns null if the prefix
  *     cannot be found or the node is the wrong type.
@@ -14147,7 +14147,7 @@
  *     correspond to these abstract events - so instead of listening for
  *     individual browser events, they only listen for the abstract events
  *     defined by the handler.
- *     
+ *
  * Handlers are created by controls, which ultimately have the responsibility
  *     of making changes to the the state of the application.  Handlers
  *     themselves may make temporary changes, but in general are expected to
@@ -14160,7 +14160,7 @@
      * {String}
      */
     id: null,
-        
+
     /**
      * APIProperty: control
      * {<OpenLayers.Control>}. The control that initialized this handler.  The
@@ -14199,7 +14199,7 @@
      * {Boolean}
      */
     active: false,
-    
+
     /**
      * Property: evt
      * {Event} This property references the last event handled by the handler.
@@ -14230,14 +14230,14 @@
         this.control = control;
         this.callbacks = callbacks;
         if (control.map) {
-            this.setMap(control.map); 
+            this.setMap(control.map);
         }
 
         OpenLayers.Util.extend(this, options);
-        
+
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
-    
+
     /**
      * Method: setMap
      */
@@ -14263,7 +14263,7 @@
             (evt.shiftKey ? OpenLayers.Handler.MOD_SHIFT : 0) |
             (evt.ctrlKey  ? OpenLayers.Handler.MOD_CTRL  : 0) |
             (evt.altKey   ? OpenLayers.Handler.MOD_ALT   : 0);
-    
+
         /* if it differs from the handler object's key mask,
            bail out of the event handler */
         return (keyModifiers == this.keyMask);
@@ -14272,8 +14272,8 @@
     /**
      * APIMethod: activate
      * Turn on the handler.  Returns false if the handler was already active.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Boolean} The handler was activated.
      */
     activate: function() {
@@ -14284,17 +14284,17 @@
         var events = OpenLayers.Events.prototype.BROWSER_EVENTS;
         for (var i=0, len=events.length; i<len; i++) {
             if (this[events[i]]) {
-                this.register(events[i], this[events[i]]); 
+                this.register(events[i], this[events[i]]);
             }
-        } 
+        }
         this.active = true;
         return true;
     },
-    
+
     /**
      * APIMethod: deactivate
      * Turn off the handler.  Returns false if the handler was already inactive.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was deactivated.
      */
@@ -14306,9 +14306,9 @@
         var events = OpenLayers.Events.prototype.BROWSER_EVENTS;
         for (var i=0, len=events.length; i<len; i++) {
             if (this[events[i]]) {
-                this.unregister(events[i], this[events[i]]); 
+                this.unregister(events[i], this[events[i]]);
             }
-        } 
+        }
         this.active = false;
         return true;
     },
@@ -14320,7 +14320,7 @@
     * Parameters:
     * name - {String} The key for the callback that is one of the properties
     *     of the handler's callbacks object.
-    * args - {Array(*)} An array of arguments (any type) with which to call 
+    * args - {Array(*)} An array of arguments (any type) with which to call
     *     the callback (defined by the control).
     */
     callback: function (name, args) {
@@ -14344,10 +14344,10 @@
     * unregister an event from the map
     */
     unregister: function (name, method) {
-        this.map.events.unregister(name, this, method);   
+        this.map.events.unregister(name, this, method);
         this.map.events.unregister(name, this, this.setEvent);
     },
-    
+
     /**
      * Method: setEvent
      * With each registered browser event, the handler sets its own evt
@@ -14378,7 +14378,7 @@
         // unregister event listeners
         this.deactivate();
         // eliminate circular references
-        this.control = this.map = null;        
+        this.control = this.map = null;
     },
 
     CLASS_NAME: "OpenLayers.Handler"
@@ -14428,16 +14428,16 @@
  * Class: OpenLayers.Map
  * Instances of OpenLayers.Map are interactive maps embedded in a web page.
  * Create a new map with the <OpenLayers.Map> constructor.
- * 
+ *
  * On their own maps do not provide much functionality.  To extend a map
- * it's necessary to add controls (<OpenLayers.Control>) and 
- * layers (<OpenLayers.Layer>) to the map. 
+ * it's necessary to add controls (<OpenLayers.Control>) and
+ * layers (<OpenLayers.Layer>) to the map.
  */
 OpenLayers.Map = OpenLayers.Class({
-    
+
     /**
      * Constant: Z_INDEX_BASE
-     * {Object} Base z-indexes for different classes of thing 
+     * {Object} Base z-indexes for different classes of thing
      */
     Z_INDEX_BASE: {
         BaseLayer: 100,
@@ -14469,7 +14469,7 @@
      *
      * Supported map event types:
      *  - *preaddlayer* triggered before a layer has been added.  The event
-     *      object will include a *layer* property that references the layer  
+     *      object will include a *layer* property that references the layer
      *      to be added.
      *  - *addlayer* triggered after a layer has been added.  The event object
      *      will include a *layer* property that references the added layer.
@@ -14497,7 +14497,7 @@
      *  - *dragend* Does not work.  Register for moveend instead.
      *  - *changebaselayer* triggered after the base layer changes
      */
-    EVENT_TYPES: [ 
+    EVENT_TYPES: [
         "preaddlayer", "addlayer", "removelayer", "changelayer", "movestart",
         "move", "moveend", "zoomend", "popupopen", "popupclose",
         "addmarker", "removemarker", "clearmarkers", "mouseover",
@@ -14509,7 +14509,7 @@
      * {String} Unique identifier for the map
      */
     id: null,
-    
+
     /**
      * Property: fractionalZoom
      * {Boolean} For a base layer that supports it, allow the map resolution
@@ -14528,14 +14528,14 @@
      *     former works for non-integer zoom levels.
      */
     fractionalZoom: false,
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *                       events on the map
      */
     events: null,
-    
+
     /**
      * APIProperty: allOverlays
      * {Boolean} Allow the map to function with "overlays" only.  Defaults to
@@ -14562,13 +14562,13 @@
      *     div property may or may not be provided.  If the div property
      *     is not provided, the map can be rendered to a container later
      *     using the <render> method.
-     *     
+     *
      * Note: If you calling <render> after map construction, do not use
      *     <maxResolution>  auto.  Instead, divide your <maxExtent> by your
      *     maximum expected dimension.
      */
     div: null,
-    
+
     /**
      * Property: dragging
      * {Boolean} The map is currently being dragged.
@@ -14580,7 +14580,7 @@
      * {<OpenLayers.Size>} Size of the main div (this.div)
      */
     size: null,
-    
+
     /**
      * Property: viewPortDiv
      * {HTMLDivElement} The element that represents the map viewport
@@ -14631,7 +14631,7 @@
      * min/max zoom level, projection, etc.
      */
     baseLayer: null,
-    
+
     /**
      * Property: center
      * {<OpenLayers.LonLat>} The current center of the map
@@ -14648,25 +14648,25 @@
      * Property: zoom
      * {Integer} The current zoom level of the map
      */
-    zoom: 0,    
+    zoom: 0,
 
     /**
      * Property: panRatio
      * {Float} The ratio of the current extent within
      *         which panning will tween.
      */
-    panRatio: 1.5,    
+    panRatio: 1.5,
 
     /**
      * Property: viewRequestID
-     * {String} Used to store a unique identifier that changes when the map 
-     *          view changes. viewRequestID should be used when adding data 
-     *          asynchronously to the map: viewRequestID is incremented when 
-     *          you initiate your request (right now during changing of 
-     *          baselayers and changing of zooms). It is stored here in the 
-     *          map and also in the data that will be coming back 
-     *          asynchronously. Before displaying this data on request 
-     *          completion, we check that the viewRequestID of the data is 
+     * {String} Used to store a unique identifier that changes when the map
+     *          view changes. viewRequestID should be used when adding data
+     *          asynchronously to the map: viewRequestID is incremented when
+     *          you initiate your request (right now during changing of
+     *          baselayers and changing of zooms). It is stored here in the
+     *          map and also in the data that will be coming back
+     *          asynchronously. Before displaying this data on request
+     *          completion, we check that the viewRequestID of the data is
      *          still the same as that of the map. Fix for #480
      */
     viewRequestID: 0,
@@ -14682,12 +14682,12 @@
 
     /**
      * APIProperty: projection
-     * {String} Set in the map options to override the default projection 
-     *          string this map - also set maxExtent, maxResolution, and 
+     * {String} Set in the map options to override the default projection
+     *          string this map - also set maxExtent, maxResolution, and
      *          units if appropriate.  Default is "EPSG:4326".
      */
-    projection: "EPSG:4326",    
-        
+    projection: "EPSG:4326",
+
     /**
      * APIProperty: units
      * {String} The map units.  Defaults to 'degrees'.  Possible values are
@@ -14697,9 +14697,9 @@
 
     /**
      * APIProperty: resolutions
-     * {Array(Float)} A list of map resolutions (map units per pixel) in 
-     *     descending order.  If this is not set in the layer constructor, it 
-     *     will be set based on other resolution related properties 
+     * {Array(Float)} A list of map resolutions (map units per pixel) in
+     *     descending order.  If this is not set in the layer constructor, it
+     *     will be set based on other resolution related properties
      *     (maxExtent, maxResolution, maxScale, etc.).
      */
     resolutions: null,
@@ -14707,8 +14707,8 @@
     /**
      * APIProperty: maxResolution
      * {Float} Default max is 360 deg / 256 px, which corresponds to
-     *          zoom level 0 on gmaps.  Specify a different value in the map 
-     *          options if you are not using a geographic projection and 
+     *          zoom level 0 on gmaps.  Specify a different value in the map
+     *          options if you are not using a geographic projection and
      *          displaying the whole world.
      */
     maxResolution: 1.40625,
@@ -14734,20 +14734,20 @@
     /**
      * APIProperty: maxExtent
      * {<OpenLayers.Bounds>} The maximum extent for the map.  Defaults to the
-     *                       whole world in decimal degrees 
+     *                       whole world in decimal degrees
      *                       (-180, -90, 180, 90).  Specify a different
-     *                        extent in the map options if you are not using a 
-     *                        geographic projection and displaying the whole 
+     *                        extent in the map options if you are not using a
+     *                        geographic projection and displaying the whole
      *                        world.
      */
     maxExtent: null,
-    
+
     /**
      * APIProperty: minExtent
      * {<OpenLayers.Bounds>}
      */
     minExtent: null,
-    
+
     /**
      * APIProperty: restrictedExtent
      * {<OpenLayers.Bounds>} Limit map navigation to this extent where possible.
@@ -14769,18 +14769,18 @@
     /**
      * APIProperty: theme
      * {String} Relative path to a CSS file from which to load theme styles.
-     *          Specify null in the map options (e.g. {theme: null}) if you 
-     *          want to get cascading style declarations - by putting links to 
+     *          Specify null in the map options (e.g. {theme: null}) if you
+     *          want to get cascading style declarations - by putting links to
      *          stylesheets or style declarations directly in your page.
      */
     theme: null,
-    
-    /** 
+
+    /**
      * APIProperty: displayProjection
      * {<OpenLayers.Projection>} Requires proj4js support.Projection used by
      *     several controls to display data to user. If this property is set,
      *     it will be set on any control which has a null displayProjection
-     *     property at the time the control is added to the map. 
+     *     property at the time the control is added to the map.
      */
     displayProjection: null,
 
@@ -14791,7 +14791,7 @@
      *           Default is to fall through.
      */
     fallThrough: true,
-    
+
     /**
      * Property: panTween
      * {OpenLayers.Tween} Animated panning tween object, see panTo()
@@ -14814,7 +14814,7 @@
      * animated panning.
      */
     panMethod: OpenLayers.Easing.Expo.easeOut,
-    
+
     /**
      * Property: panDuration
      * {Integer} The number of steps to be passed to the
@@ -14823,14 +14823,14 @@
      * Default is 50.
      */
     panDuration: 50,
-    
+
     /**
      * Property: paddingForPopups
-     * {<OpenLayers.Bounds>} Outside margin of the popup. Used to prevent 
+     * {<OpenLayers.Bounds>} Outside margin of the popup. Used to prevent
      *     the popup from getting too close to the map border.
      */
     paddingForPopups : null,
-    
+
     /**
      * Constructor: OpenLayers.Map
      * Constructor for a new OpenLayers.Map instance.  There are two possible
@@ -14875,28 +14875,28 @@
      *     units: 'm',
      *     projection: "EPSG:41001"
      * });
-     */    
+     */
     initialize: function (div, options) {
-        
+
         // If only one argument is provided, check if it is an object.
         if(arguments.length === 1 && typeof div === "object") {
             options = div;
             div = options && options.div;
         }
 
-        // Simple-type defaults are set in class definition. 
-        //  Now set complex-type defaults 
+        // Simple-type defaults are set in class definition.
+        //  Now set complex-type defaults
         this.tileSize = new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,
                                             OpenLayers.Map.TILE_HEIGHT);
-        
+
         this.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90);
-        
+
         this.paddingForPopups = new OpenLayers.Bounds(15, 15, 15, 15);
 
-        this.theme = OpenLayers._getScriptLocation() + 
-                             'theme/default/style.css'; 
+        this.theme = OpenLayers._getScriptLocation() +
+                             'theme/default/style.css';
 
-        // now override default options 
+        // now override default options
         OpenLayers.Util.extend(this, options);
 
         this.id = OpenLayers.Util.createUniqueID("OpenLayers.Map_");
@@ -14907,7 +14907,7 @@
             this.div.style.height = "1px";
             this.div.style.width = "1px";
         }
-        
+
         OpenLayers.Element.addClass(this.div, 'olMap');
 
         // the viewPortDiv is the outermost div we modify
@@ -14924,37 +14924,37 @@
         id = this.div.id + "_OpenLayers_Container";
         this.layerContainerDiv = OpenLayers.Util.createDiv(id);
         this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;
-        
+
         this.viewPortDiv.appendChild(this.layerContainerDiv);
 
-        this.events = new OpenLayers.Events(this, 
-                                            this.div, 
-                                            this.EVENT_TYPES, 
-                                            this.fallThrough, 
+        this.events = new OpenLayers.Events(this,
+                                            this.div,
+                                            this.EVENT_TYPES,
+                                            this.fallThrough,
                                             {includeXY: true});
         this.updateSize();
         if(this.eventListeners instanceof Object) {
             this.events.on(this.eventListeners);
         }
- 
+
         // update the map size and location before the map moves
         this.events.register("movestart", this, this.updateSize);
 
-        // Because Mozilla does not support the "resize" event for elements 
-        // other than "window", we need to put a hack here. 
+        // Because Mozilla does not support the "resize" event for elements
+        // other than "window", we need to put a hack here.
         if (OpenLayers.String.contains(navigator.appName, "Microsoft")) {
             // If IE, register the resize on the div
             this.events.register("resize", this, this.updateSize);
         } else {
             // Else updateSize on catching the window's resize
-            //  Note that this is ok, as updateSize() does nothing if the 
+            //  Note that this is ok, as updateSize() does nothing if the
             //  map's size has not actually changed.
-            this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize, 
+            this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize,
                 this);
             OpenLayers.Event.observe(window, 'resize',
                             this.updateSizeDestroy);
         }
-        
+
         // only append link stylesheet if the theme property is set
         if(this.theme) {
             // check existing links for equivalent url
@@ -14979,7 +14979,7 @@
         }
 
         this.layers = [];
-        
+
         if (this.controls == null) {
             if (OpenLayers.Control != null) { // running full or lite?
                 this.controls = [ new OpenLayers.Control.Navigation(),
@@ -14999,16 +14999,16 @@
         this.popups = [];
 
         this.unloadDestroy = OpenLayers.Function.bind(this.destroy, this);
-        
 
+
         // always call map.destroy()
         OpenLayers.Event.observe(window, 'unload', this.unloadDestroy);
     },
-    
+
     /**
      * APIMethod: render
      * Render the map to a specified container.
-     * 
+     *
      * Parameters:
      * div - {String|DOMElement} The container that the map should be rendered
      *     to. If different than the current container, the map viewport
@@ -15029,11 +15029,11 @@
      *     so that if map is manually destroyed, we can unregister this.
      */
     unloadDestroy: null,
-    
+
     /**
      * Method: updateSizeDestroy
      * When the map is destroyed, we need to stop listening to updateSize
-     *    events: this method stores the function we need to unregister in 
+     *    events: this method stores the function we need to unregister in
      *    non-IE browsers.
      */
     updateSizeDestroy: null,
@@ -15053,26 +15053,26 @@
         this.unloadDestroy = null;
 
         if (this.updateSizeDestroy) {
-            OpenLayers.Event.stopObserving(window, 'resize', 
+            OpenLayers.Event.stopObserving(window, 'resize',
                                            this.updateSizeDestroy);
         } else {
             this.events.unregister("resize", this, this.updateSize);
-        }    
-        
-        this.paddingForPopups = null;    
+        }
 
+        this.paddingForPopups = null;
+
         if (this.controls != null) {
             for (var i = this.controls.length - 1; i>=0; --i) {
                 this.controls[i].destroy();
-            } 
+            }
             this.controls = null;
         }
         if (this.layers != null) {
             for (var i = this.layers.length - 1; i>=0; --i) {
-                //pass 'false' to destroy so that map wont try to set a new 
+                //pass 'false' to destroy so that map wont try to set a new
                 // baselayer after each baselayer is removed
                 this.layers[i].destroy(false);
-            } 
+            }
             this.layers = null;
         }
         if (this.viewPortDiv) {
@@ -15247,7 +15247,7 @@
   /*     The following functions deal with adding and     */
   /*        removing Layers to and from the Map           */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
     /**
      * APIMethod: getLayer
@@ -15257,7 +15257,7 @@
      * id - {String} A layer id
      *
      * Returns:
-     * {<OpenLayers.Layer>} The Layer with the corresponding id from the map's 
+     * {<OpenLayers.Layer>} The Layer with the corresponding id from the map's
      *                      layer collection, or null if not found.
      */
     getLayer: function(id) {
@@ -15274,11 +15274,11 @@
 
     /**
     * Method: setLayerZIndex
-    * 
+    *
     * Parameters:
-    * layer - {<OpenLayers.Layer>} 
-    * zIdx - {int} 
-    */    
+    * layer - {<OpenLayers.Layer>}
+    * zIdx - {int}
+    */
     setLayerZIndex: function (layer, zIdx) {
         layer.setZIndex(
             this.Z_INDEX_BASE[layer.isBaseLayer ? 'BaseLayer' : 'Overlay']
@@ -15300,12 +15300,12 @@
     * APIMethod: addLayer
     *
     * Parameters:
-    * layer - {<OpenLayers.Layer>} 
-    */    
+    * layer - {<OpenLayers.Layer>}
+    */
     addLayer: function (layer) {
         for(var i=0, len=this.layers.length; i <len; i++) {
             if (this.layers[i] == layer) {
-                var msg = OpenLayers.i18n('layerAlreadyAdded', 
+                var msg = OpenLayers.i18n('layerAlreadyAdded',
                                                       {'layerName':layer.name});
                 OpenLayers.Console.warn(msg);
                 return false;
@@ -15316,7 +15316,7 @@
         }
 
         this.events.triggerEvent("preaddlayer", {layer: layer});
-        
+
         layer.div.className = "olLayerDiv";
         layer.div.style.overflow = "";
         this.setLayerZIndex(layer, this.layers.length);
@@ -15345,43 +15345,43 @@
     },
 
     /**
-    * APIMethod: addLayers 
+    * APIMethod: addLayers
     *
     * Parameters:
-    * layers - {Array(<OpenLayers.Layer>)} 
-    */    
+    * layers - {Array(<OpenLayers.Layer>)}
+    */
     addLayers: function (layers) {
         for (var i=0, len=layers.length; i<len; i++) {
             this.addLayer(layers[i]);
         }
     },
 
-    /** 
+    /**
      * APIMethod: removeLayer
-     * Removes a layer from the map by removing its visual element (the 
-     *   layer.div property), then removing it from the map's internal list 
-     *   of layers, setting the layer's map property to null. 
-     * 
+     * Removes a layer from the map by removing its visual element (the
+     *   layer.div property), then removing it from the map's internal list
+     *   of layers, setting the layer's map property to null.
+     *
      *   a "removelayer" event is triggered.
-     * 
+     *
      *   very worthy of mention is that simply removing a layer from a map
      *   will not cause the removal of any popups which may have been created
      *   by the layer. this is due to the fact that it was decided at some
-     *   point that popups would not belong to layers. thus there is no way 
+     *   point that popups would not belong to layers. thus there is no way
      *   for us to know here to which layer the popup belongs.
-     *    
+     *
      *     A simple solution to this is simply to call destroy() on the layer.
      *     the default OpenLayers.Layer class's destroy() function
      *     automatically takes care to remove itself from whatever map it has
-     *     been attached to. 
-     * 
-     *     The correct solution is for the layer itself to register an 
-     *     event-handler on "removelayer" and when it is called, if it 
+     *     been attached to.
+     *
+     *     The correct solution is for the layer itself to register an
+     *     event-handler on "removelayer" and when it is called, if it
      *     recognizes itself as the layer being removed, then it cycles through
      *     its own personal list of popups, removing them from the map.
-     * 
+     *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
+     * layer - {<OpenLayers.Layer>}
      * setNewBaseLayer - {Boolean} Default is true
      */
     removeLayer: function(layer, setNewBaseLayer) {
@@ -15419,7 +15419,7 @@
 
     /**
      * APIMethod: getNumLayers
-     * 
+     *
      * Returns:
      * {Int} The number of layers attached to the map.
      */
@@ -15427,7 +15427,7 @@
         return this.layers.length;
     },
 
-    /** 
+    /**
      * APIMethod: getLayerIndex
      *
      * Parameters:
@@ -15440,8 +15440,8 @@
     getLayerIndex: function (layer) {
         return OpenLayers.Util.indexOf(this.layers, layer);
     },
-    
-    /** 
+
+    /**
      * APIMethod: setLayerIndex
      * Move the given layer to the specified (zero-based) index in the layer
      *     list, changing its z-index in the map display. Use
@@ -15450,8 +15450,8 @@
      *     raise base layers above overlays.
      *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
-     * idx - {int} 
+     * layer - {<OpenLayers.Layer>}
+     * idx - {int}
      */
     setLayerIndex: function (layer, idx) {
         var base = this.getLayerIndex(layer);
@@ -15479,27 +15479,27 @@
         }
     },
 
-    /** 
+    /**
      * APIMethod: raiseLayer
-     * Change the index of the given layer by delta. If delta is positive, 
+     * Change the index of the given layer by delta. If delta is positive,
      *     the layer is moved up the map's layer stack; if delta is negative,
      *     the layer is moved down.  Again, note that this cannot (or at least
      *     should not) be effectively used to raise base layers above overlays.
      *
      * Paremeters:
-     * layer - {<OpenLayers.Layer>} 
-     * delta - {int} 
+     * layer - {<OpenLayers.Layer>}
+     * delta - {int}
      */
     raiseLayer: function (layer, delta) {
         var idx = this.getLayerIndex(layer) + delta;
         this.setLayerIndex(layer, idx);
     },
-    
-    /** 
+
+    /**
      * APIMethod: setBaseLayer
      * Allows user to specify one of the currently-loaded layers as the Map's
      *     new base layer.
-     * 
+     *
      * Parameters:
      * newBaseLayer - {<OpenLayers.Layer>}
      */
@@ -15510,20 +15510,20 @@
         }
 
         if (newBaseLayer != this.baseLayer) {
-          
+
             // is newBaseLayer an already loaded layer?m
             if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
 
-                // make the old base layer invisible 
+                // make the old base layer invisible
                 if (this.baseLayer != null && !this.allOverlays) {
                     this.baseLayer.setVisibility(false);
                 }
 
                 // set new baselayer
                 this.baseLayer = newBaseLayer;
-                
-                // Increment viewRequestID since the baseLayer is 
-                // changing. This is used by tiles to check if they should 
+
+                // Increment viewRequestID since the baseLayer is
+                // changing. This is used by tiles to check if they should
                 // draw themselves.
                 this.viewRequestID++;
                 if(!this.allOverlays) {
@@ -15535,14 +15535,14 @@
                 if (center != null) {
 
                     //either get the center from the old Extent or just from
-                    // the current center of the map. 
-                    var newCenter = (oldExtent) 
+                    // the current center of the map.
+                    var newCenter = (oldExtent)
                         ? oldExtent.getCenterLonLat()
                         : center;
 
-                    //the new zoom will either come from the old Extent or 
-                    // from the current resolution of the map                                                
-                    var newZoom = (oldExtent) 
+                    //the new zoom will either come from the old Extent or
+                    // from the current resolution of the map
+                    var newZoom = (oldExtent)
                         ? this.getZoomForExtent(oldExtent, true)
                         : this.getZoomForResolution(this.resolution, true);
 
@@ -15553,7 +15553,7 @@
                 this.events.triggerEvent("changebaselayer", {
                     layer: this.baseLayer
                 });
-            }        
+            }
         }
     },
 
@@ -15565,15 +15565,15 @@
   /*     The following functions deal with adding and     */
   /*        removing Controls to and from the Map         */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
     /**
      * APIMethod: addControl
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>}
      * px - {<OpenLayers.Pixel>}
-     */    
+     */
     addControl: function (control, px) {
         this.controls.push(control);
         this.addControlToMap(control, px);
@@ -15581,23 +15581,23 @@
 
     /**
      * Method: addControlToMap
-     * 
+     *
      * Parameters:
-     * 
+     *
      * control - {<OpenLayers.Control>}
      * px - {<OpenLayers.Pixel>}
-     */    
+     */
     addControlToMap: function (control, px) {
         // If a control doesn't have a div at this point, it belongs in the
         // viewport.
         control.outsideViewport = (control.div != null);
-        
-        // If the map has a displayProjection, and the control doesn't, set 
+
+        // If the map has a displayProjection, and the control doesn't, set
         // the display projection.
         if (this.displayProjection && !control.displayProjection) {
             control.displayProjection = this.displayProjection;
-        }    
-        
+        }
+
         control.setMap(this);
         var div = control.draw(px);
         if (div) {
@@ -15608,18 +15608,18 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: getControl
-     * 
+     *
      * Parameters:
      * id - {String} ID of the control to return.
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Control>} The control from the map's list of controls 
-     *                        which has a matching 'id'. If none found, 
+     * {<OpenLayers.Control>} The control from the map's list of controls
+     *                        which has a matching 'id'. If none found,
      *                        returns null.
-     */    
+     */
     getControl: function (id) {
         var returnControl = null;
         for(var i=0, len=this.controls.length; i<len; i++) {
@@ -15631,16 +15631,16 @@
         }
         return returnControl;
     },
-    
-    /** 
+
+    /**
      * APIMethod: removeControl
-     * Remove a control from the map. Removes the control both from the map 
-     *     object's internal array of controls, as well as from the map's 
+     * Remove a control from the map. Removes the control both from the map
+     *     object's internal array of controls, as well as from the map's
      *     viewPort (assuming the control was not added outsideViewport)
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control to remove.
-     */    
+     */
     removeControl: function (control) {
         //make sure control is non-null and actually part of our map
         if ( (control) && (control == this.getControl(control.id)) ) {
@@ -15658,11 +15658,11 @@
   /*     The following functions deal with adding and     */
   /*        removing Popups to and from the Map           */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
-    /** 
+    /**
      * APIMethod: addPopup
-     * 
+     *
      * Parameters:
      * popup - {<OpenLayers.Popup>}
      * exclusive - {Boolean} If true, closes all other popups first
@@ -15685,10 +15685,10 @@
             this.layerContainerDiv.appendChild(popupDiv);
         }
     },
-    
-    /** 
+
+    /**
     * APIMethod: removePopup
-    * 
+    *
     * Parameters:
     * popup - {<OpenLayers.Popup>}
     */
@@ -15709,15 +15709,15 @@
   /*   The following functions deal with the access to    */
   /*    and maintenance of the size of the container div  */
   /*                                                      */
-  /********************************************************/     
+  /********************************************************/
 
     /**
      * APIMethod: getSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} An <OpenLayers.Size> object that represents the 
-     *                     size, in pixels, of the div into which OpenLayers 
-     *                     has been loaded. 
+     * {<OpenLayers.Size>} An <OpenLayers.Size> object that represents the
+     *                     size, in pixels, of the div into which OpenLayers
+     *                     has been loaded.
      *                     Note - A clone() of this locally cached variable is
      *                     returned, so as not to allow users to modify it.
      */
@@ -15732,7 +15732,7 @@
     /**
      * APIMethod: updateSize
      * This function should be called by any external code which dynamically
-     *     changes the size of the map div (because mozilla wont let us catch 
+     *     changes the size of the map div (because mozilla wont let us catch
      *     the "onresize" for an element)
      */
     updateSize: function() {
@@ -15744,13 +15744,13 @@
             this.size = oldSize = newSize;
         }
         if (!newSize.equals(oldSize)) {
-            
+
             // store the new size
             this.size = newSize;
 
             //notify layers of mapresize
             for(var i=0, len=this.layers.length; i<len; i++) {
-                this.layers[i].onMapResize();                
+                this.layers[i].onMapResize();
             }
 
             if (this.baseLayer != null) {
@@ -15763,17 +15763,17 @@
 
         }
     },
-    
+
     /**
      * Method: getCurrentSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} A new <OpenLayers.Size> object with the dimensions 
+     * {<OpenLayers.Size>} A new <OpenLayers.Size> object with the dimensions
      *                     of the map div
      */
     getCurrentSize: function() {
 
-        var size = new OpenLayers.Size(this.div.clientWidth, 
+        var size = new OpenLayers.Size(this.div.clientWidth,
                                        this.div.clientHeight);
 
         // Workaround for the fact that hidden elements return 0 for size.
@@ -15789,39 +15789,39 @@
         return size;
     },
 
-    /** 
+    /**
      * Method: calculateBounds
-     * 
+     *
      * Parameters:
      * center - {<OpenLayers.LonLat>} Default is this.getCenter()
-     * resolution - {float} Default is this.getResolution() 
-     * 
+     * resolution - {float} Default is this.getResolution()
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A bounds based on resolution, center, and 
+     * {<OpenLayers.Bounds>} A bounds based on resolution, center, and
      *                       current mapsize.
      */
     calculateBounds: function(center, resolution) {
 
         var extent = null;
-        
+
         if (center == null) {
             center = this.getCenter();
-        }                
+        }
         if (resolution == null) {
             resolution = this.getResolution();
         }
-    
+
         if ((center != null) && (resolution != null)) {
 
             var size = this.getSize();
             var w_deg = size.w * resolution;
             var h_deg = size.h * resolution;
-        
+
             extent = new OpenLayers.Bounds(center.lon - w_deg / 2,
                                            center.lat - h_deg / 2,
                                            center.lon + w_deg / 2,
                                            center.lat + h_deg / 2);
-        
+
         }
 
         return extent;
@@ -15839,7 +15839,7 @@
   /********************************************************/
     /**
      * APIMethod: getCenter
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>}
      */
@@ -15854,18 +15854,18 @@
 
     /**
      * APIMethod: getZoom
-     * 
+     *
      * Returns:
      * {Integer}
      */
     getZoom: function () {
         return this.zoom;
     },
-    
-    /** 
+
+    /**
      * APIMethod: pan
      * Allows user to pan by a value of screen pixels
-     * 
+     *
      * Parameters:
      * dx - {Integer}
      * dy - {Integer}
@@ -15884,7 +15884,7 @@
 
         // adjust
         var newCenterPx = centerPx.add(dx, dy);
-        
+
         // only call setCenter if not dragging or there has been a change
         if (!options.dragging || !newCenterPx.equals(centerPx)) {
             var newCenterLonLat = this.getLonLatFromViewPortPx(newCenterPx);
@@ -15892,16 +15892,16 @@
                 this.panTo(newCenterLonLat);
             } else {
                 this.setCenter(newCenterLonLat, null, options.dragging);
-            }    
+            }
         }
 
    },
-   
-   /** 
+
+   /**
      * APIMethod: panTo
      * Allows user to pan to a new lonlat
      * If the new lonlat is in the current extent the map will slide smoothly
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.Lonlat>}
      */
@@ -15955,13 +15955,13 @@
     /**
      * APIMethod: setCenter
      * Set the map center (and optionally, the zoom level).
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} The new center location.
      * zoom - {Integer} Optional zoom level.
-     * dragging - {Boolean} Specifies whether or not to trigger 
+     * dragging - {Boolean} Specifies whether or not to trigger
      *                      movestart/end events
-     * forceZoomChange - {Boolean} Specifies whether or not to trigger zoom 
+     * forceZoomChange - {Boolean} Specifies whether or not to trigger zoom
      *                             change events (needed on baseLayer change)
      *
      * TBD: reconsider forceZoomChange in 3.0
@@ -15983,9 +15983,9 @@
      * options - {Object}
      */
     moveTo: function(lonlat, zoom, options) {
-        if (!options) { 
+        if (!options) {
             options = {};
-        }    
+        }
         // dragging is false by default
         var dragging = options.dragging;
         // forceZoomChange is false by default
@@ -15995,51 +15995,51 @@
 
         if (this.panTween && options.caller == "setCenter") {
             this.panTween.stop();
-        }    
-             
+        }
+
         if (!this.center && !this.isValidLonLat(lonlat)) {
             lonlat = this.maxExtent.getCenterLonLat();
         }
 
         if(this.restrictedExtent != null) {
             // In 3.0, decide if we want to change interpretation of maxExtent.
-            if(lonlat == null) { 
-                lonlat = this.getCenter(); 
+            if(lonlat == null) {
+                lonlat = this.getCenter();
             }
-            if(zoom == null) { 
-                zoom = this.getZoom(); 
+            if(zoom == null) {
+                zoom = this.getZoom();
             }
             var resolution = this.getResolutionForZoom(zoom);
-            var extent = this.calculateBounds(lonlat, resolution); 
+            var extent = this.calculateBounds(lonlat, resolution);
             if(!this.restrictedExtent.containsBounds(extent)) {
-                var maxCenter = this.restrictedExtent.getCenterLonLat(); 
-                if(extent.getWidth() > this.restrictedExtent.getWidth()) { 
-                    lonlat = new OpenLayers.LonLat(maxCenter.lon, lonlat.lat); 
+                var maxCenter = this.restrictedExtent.getCenterLonLat();
+                if(extent.getWidth() > this.restrictedExtent.getWidth()) {
+                    lonlat = new OpenLayers.LonLat(maxCenter.lon, lonlat.lat);
                 } else if(extent.left < this.restrictedExtent.left) {
                     lonlat = lonlat.add(this.restrictedExtent.left -
-                                        extent.left, 0); 
-                } else if(extent.right > this.restrictedExtent.right) { 
+                                        extent.left, 0);
+                } else if(extent.right > this.restrictedExtent.right) {
                     lonlat = lonlat.add(this.restrictedExtent.right -
-                                        extent.right, 0); 
-                } 
-                if(extent.getHeight() > this.restrictedExtent.getHeight()) { 
-                    lonlat = new OpenLayers.LonLat(lonlat.lon, maxCenter.lat); 
-                } else if(extent.bottom < this.restrictedExtent.bottom) { 
+                                        extent.right, 0);
+                }
+                if(extent.getHeight() > this.restrictedExtent.getHeight()) {
+                    lonlat = new OpenLayers.LonLat(lonlat.lon, maxCenter.lat);
+                } else if(extent.bottom < this.restrictedExtent.bottom) {
                     lonlat = lonlat.add(0, this.restrictedExtent.bottom -
-                                        extent.bottom); 
-                } 
-                else if(extent.top > this.restrictedExtent.top) { 
+                                        extent.bottom);
+                }
+                else if(extent.top > this.restrictedExtent.top) {
                     lonlat = lonlat.add(0, this.restrictedExtent.top -
-                                        extent.top); 
-                } 
+                                        extent.top);
+                }
             }
         }
-        
+
         var zoomChanged = forceZoomChange || (
-                            (this.isValidZoomLevel(zoom)) && 
+                            (this.isValidZoomLevel(zoom)) &&
                             (zoom != this.getZoom()) );
 
-        var centerChanged = (this.isValidLonLat(lonlat)) && 
+        var centerChanged = (this.isValidLonLat(lonlat)) &&
                             (!lonlat.equals(this.center));
 
 
@@ -16051,7 +16051,7 @@
             }
 
             if (centerChanged) {
-                if ((!zoomChanged) && (this.center)) { 
+                if ((!zoomChanged) && (this.center)) {
                     // if zoom hasnt changed, just slide layerContainer
                     //  (must be done before setting this.center to new value)
                     this.centerLayerContainer(lonlat);
@@ -16071,12 +16071,12 @@
                 this.resolution = this.getResolutionForZoom(zoom);
                 // zoom level has changed, increment viewRequestID.
                 this.viewRequestID++;
-            }    
-            
+            }
+
             var bounds = this.getExtent();
-            
-            //send the move call to the baselayer and all the overlays    
 
+            //send the move call to the baselayer and all the overlays
+
             if(this.baseLayer.visibility) {
                 this.baseLayer.moveTo(bounds, zoomChanged, dragging);
                 if(dragging) {
@@ -16087,9 +16087,9 @@
                     );
                 }
             }
-            
+
             bounds = this.baseLayer.getExtent();
-            
+
             for (var i=0, len=this.layers.length; i<len; i++) {
                 var layer = this.layers[i];
                 if (layer !== this.baseLayer && !layer.isBaseLayer) {
@@ -16117,18 +16117,18 @@
                             );
                         }
                     }
-                }                
+                }
             }
-            
+
             if (zoomChanged) {
                 //redraw popups
                 for (var i=0, len=this.popups.length; i<len; i++) {
                     this.popups[i].updatePosition();
                 }
-            }    
-            
+            }
+
             this.events.triggerEvent("move");
-    
+
             if (zoomChanged) { this.events.triggerEvent("zoomend"); }
         }
 
@@ -16136,16 +16136,16 @@
         if (!dragging && !noEvent) {
             this.events.triggerEvent("moveend");
         }
-        
+
         // Store the map dragging state for later use
-        this.dragging = !!dragging; 
+        this.dragging = !!dragging;
 
     },
 
-    /** 
+    /**
      * Method: centerLayerContainer
      * This function takes care to recenter the layerContainerDiv.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
      */
@@ -16162,26 +16162,26 @@
 
     /**
      * Method: isValidZoomLevel
-     * 
+     *
      * Parameters:
      * zoomLevel - {Integer}
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the zoom level passed in is non-null and 
+     * {Boolean} Whether or not the zoom level passed in is non-null and
      *           within the min/max range of zoom levels.
      */
     isValidZoomLevel: function(zoomLevel) {
        return ( (zoomLevel != null) &&
-                (zoomLevel >= 0) && 
+                (zoomLevel >= 0) &&
                 (zoomLevel < this.getNumZoomLevels()) );
     },
-    
+
     /**
      * Method: isValidLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the lonlat passed in is non-null and within
      *           the maxExtent bounds
@@ -16190,7 +16190,7 @@
         var valid = false;
         if (lonlat != null) {
             var maxExtent = this.getMaxExtent();
-            valid = maxExtent.containsLonLat(lonlat);        
+            valid = maxExtent.containsLonLat(lonlat);
         }
         return valid;
     },
@@ -16202,25 +16202,25 @@
   /*    Accessor functions to Layer Options parameters    */
   /*                                                      */
   /********************************************************/
-    
+
     /**
      * APIMethod: getProjection
-     * This method returns a string representing the projection. In 
+     * This method returns a string representing the projection. In
      *     the case of projection support, this will be the srsCode which
      *     is loaded -- otherwise it will simply be the string value that
      *     was passed to the projection at startup.
      *
      * FIXME: In 3.0, we will remove getProjectionObject, and instead
-     *     return a Projection object from this function. 
-     * 
+     *     return a Projection object from this function.
+     *
      * Returns:
-     * {String} The Projection string from the base layer or null. 
+     * {String} The Projection string from the base layer or null.
      */
     getProjection: function() {
         var projection = this.getProjectionObject();
         return projection ? projection.getCode() : null;
     },
-    
+
     /**
      * APIMethod: getProjectionObject
      * Returns the projection obect from the baselayer.
@@ -16235,10 +16235,10 @@
         }
         return projection;
     },
-    
+
     /**
      * APIMethod: getMaxResolution
-     * 
+     *
      * Returns:
      * {String} The Map's Maximum Resolution
      */
@@ -16249,19 +16249,19 @@
         }
         return maxResolution;
     },
-        
+
     /**
      * APIMethod: getMaxExtent
      *
      * Parameters:
-     * options - {Object} 
-     * 
+     * options - {Object}
+     *
      * Allowed Options:
-     * restricted - {Boolean} If true, returns restricted extent (if it is 
+     * restricted - {Boolean} If true, returns restricted extent (if it is
      *     available.)
      *
      * Returns:
-     * {<OpenLayers.Bounds>} The maxExtent property as set on the current 
+     * {<OpenLayers.Bounds>} The maxExtent property as set on the current
      *     baselayer, unless the 'restricted' option is set, in which case
      *     the 'restrictedExtent' option from the map is returned (if it
      *     is set).
@@ -16272,15 +16272,15 @@
             maxExtent = this.restrictedExtent;
         } else if (this.baseLayer != null) {
             maxExtent = this.baseLayer.maxExtent;
-        }        
+        }
         return maxExtent;
     },
-    
+
     /**
      * APIMethod: getNumZoomLevels
-     * 
+     *
      * Returns:
-     * {Integer} The total number of zoom levels that can be displayed by the 
+     * {Integer} The total number of zoom levels that can be displayed by the
      *           current baseLayer.
      */
     getNumZoomLevels: function() {
@@ -16304,10 +16304,10 @@
 
     /**
      * APIMethod: getExtent
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
-     *                       bounds of the current viewPort. 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
+     *                       bounds of the current viewPort.
      *                       If no baselayer is set, returns null.
      */
     getExtent: function () {
@@ -16320,9 +16320,9 @@
 
     /**
      * APIMethod: getResolution
-     * 
+     *
      * Returns:
-     * {Float} The current resolution of the map. 
+     * {Float} The current resolution of the map.
      *         If no baselayer is set, returns null.
      */
     getResolution: function () {
@@ -16335,9 +16335,9 @@
 
     /**
      * APIMethod: getUnits
-     * 
+     *
      * Returns:
-     * {Float} The current units of the map. 
+     * {Float} The current units of the map.
      *         If no baselayer is set, returns null.
      */
     getUnits: function () {
@@ -16350,9 +16350,9 @@
 
      /**
       * APIMethod: getScale
-      * 
+      *
       * Returns:
-      * {Float} The current scale denominator of the map. 
+      * {Float} The current scale denominator of the map.
       *         If no baselayer is set, returns null.
       */
     getScale: function () {
@@ -16368,14 +16368,14 @@
 
     /**
      * APIMethod: getZoomForExtent
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      * Returns:
      * {Integer} A suitable zoom level for the specified bounds.
      *           If no baselayer is set, returns null.
@@ -16390,10 +16390,10 @@
 
     /**
      * APIMethod: getResolutionForZoom
-     * 
+     *
      * Parameter:
      * zoom - {Float}
-     * 
+     *
      * Returns:
      * {Float} A suitable resolution for the specified zoom.  If no baselayer
      *     is set, returns null.
@@ -16408,17 +16408,17 @@
 
     /**
      * APIMethod: getZoomForResolution
-     * 
+     *
      * Parameter:
      * resolution - {Float}
-     * closest - {Boolean} Find the zoom level that corresponds to the absolute 
+     * closest - {Boolean} Find the zoom level that corresponds to the absolute
      *     closest resolution, which may result in a zoom whose corresponding
      *     resolution is actually smaller than we would have desired (if this
      *     is being called from a getZoomForExtent() call, then this means that
-     *     the returned zoom index might not actually contain the entire 
+     *     the returned zoom index might not actually contain the entire
      *     extent specified... but it'll be close).
      *     Default is false.
-     * 
+     *
      * Returns:
      * {Integer} A suitable zoom level for the specified resolution.
      *           If no baselayer is set, returns null.
@@ -16440,11 +16440,11 @@
   /*               the setCenter() function               */
   /*                                                      */
   /********************************************************/
-  
-    /** 
+
+    /**
      * APIMethod: zoomTo
      * Zoom to a specific zoom level
-     * 
+     *
      * Parameters:
      * zoom - {Integer}
      */
@@ -16453,20 +16453,20 @@
             this.setCenter(null, zoom);
         }
     },
-    
+
     /**
      * APIMethod: zoomIn
-     * 
+     *
      * Parameters:
      * zoom - {int}
      */
     zoomIn: function() {
         this.zoomTo(this.getZoom() + 1);
     },
-    
+
     /**
      * APIMethod: zoomOut
-     * 
+     *
      * Parameters:
      * zoom - {int}
      */
@@ -16477,35 +16477,35 @@
     /**
      * APIMethod: zoomToExtent
      * Zoom to the passed in bounds, recenter
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      */
     zoomToExtent: function(bounds, closest) {
         var center = bounds.getCenterLonLat();
         if (this.baseLayer.wrapDateLine) {
             var maxExtent = this.getMaxExtent();
 
-            //fix straddling bounds (in the case of a bbox that straddles the 
-            // dateline, it's left and right boundaries will appear backwards. 
+            //fix straddling bounds (in the case of a bbox that straddles the
+            // dateline, it's left and right boundaries will appear backwards.
             // we fix this by allowing a right value that is greater than the
-            // max value at the dateline -- this allows us to pass a valid 
+            // max value at the dateline -- this allows us to pass a valid
             // bounds to calculate zoom)
             //
             bounds = bounds.clone();
             while (bounds.right < bounds.left) {
                 bounds.right += maxExtent.getWidth();
             }
-            //if the bounds was straddling (see above), then the center point 
+            //if the bounds was straddling (see above), then the center point
             // we got from it was wrong. So we take our new bounds and ask it
-            // for the center. Because our new bounds is at least partially 
-            // outside the bounds of maxExtent, the new calculated center 
-            // might also be. We don't want to pass a bad center value to 
+            // for the center. Because our new bounds is at least partially
+            // outside the bounds of maxExtent, the new calculated center
+            // might also be. We don't want to pass a bad center value to
             // setCenter, so we have it wrap itself across the date line.
             //
             center = bounds.getCenterLonLat().wrapDateLine(maxExtent);
@@ -16513,15 +16513,15 @@
         this.setCenter(center, this.getZoomForExtent(bounds, closest));
     },
 
-    /** 
+    /**
      * APIMethod: zoomToMaxExtent
      * Zoom to the full extent and recenter.
      *
      * Parameters:
-     * options - 
-     * 
+     * options -
+     *
      * Allowed Options:
-     * restricted - {Boolean} True to zoom to restricted extent if it is 
+     * restricted - {Boolean} True to zoom to restricted extent if it is
      *     set. Defaults to true.
      */
     zoomToMaxExtent: function(options) {
@@ -16529,25 +16529,25 @@
         var restricted = (options) ? options.restricted : true;
 
         var maxExtent = this.getMaxExtent({
-            'restricted': restricted 
+            'restricted': restricted
         });
         this.zoomToExtent(maxExtent);
     },
 
-    /** 
+    /**
      * APIMethod: zoomToScale
-     * Zoom to a specified scale 
-     * 
+     * Zoom to a specified scale
+     *
      * Parameters:
      * scale - {float}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified scale. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified scale. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      */
     zoomToScale: function(scale, closest) {
-        var res = OpenLayers.Util.getResolutionFromScale(scale, 
+        var res = OpenLayers.Util.getResolutionFromScale(scale,
                                                          this.baseLayer.units);
         var size = this.getSize();
         var w_deg = size.w * res;
@@ -16560,7 +16560,7 @@
                                            center.lat + h_deg / 2);
         this.zoomToExtent(extent, closest);
     },
-    
+
   /********************************************************/
   /*                                                      */
   /*             Translation Functions                    */
@@ -16569,24 +16569,24 @@
   /*           LonLat, LayerPx, and ViewPortPx            */
   /*                                                      */
   /********************************************************/
-      
+
   //
   // TRANSLATION: LonLat <-> ViewPortPx
   //
 
     /**
      * Method: getLonLatFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view
      *                       port <OpenLayers.Pixel>, translated into lon/lat
      *                       by the current base layer.
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
-        var lonlat = null; 
+        var lonlat = null;
         if (this.baseLayer != null) {
             lonlat = this.baseLayer.getLonLatFromViewPortPx(viewPortPx);
         }
@@ -16595,37 +16595,37 @@
 
     /**
      * APIMethod: getViewPortPxFromLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in 
-     *                      <OpenLayers.LonLat>, translated into view port 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     *                      <OpenLayers.LonLat>, translated into view port
      *                      pixels by the current base layer.
      */
     getViewPortPxFromLonLat: function (lonlat) {
-        var px = null; 
+        var px = null;
         if (this.baseLayer != null) {
             px = this.baseLayer.getViewPortPxFromLonLat(lonlat);
         }
         return px;
     },
 
-    
+
   //
   // CONVENIENCE TRANSLATION FUNCTIONS FOR API
   //
 
     /**
      * APIMethod: getLonLatFromPixel
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      *
      * Returns:
      * {<OpenLayers.LonLat>} An OpenLayers.LonLat corresponding to the given
-     *                       OpenLayers.Pixel, translated into lon/lat by the 
+     *                       OpenLayers.Pixel, translated into lon/lat by the
      *                       current base layer
      */
     getLonLatFromPixel: function (px) {
@@ -16637,12 +16637,12 @@
      * Returns a pixel location given a map location.  The map location is
      *     translated to an integer pixel location (in viewport pixel
      *     coordinates) by the current base layer.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} A map location.
-     * 
-     * Returns: 
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel corresponding to the 
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel corresponding to the
      *     <OpenLayers.LonLat> translated into view port pixels by the current
      *     base layer.
      */
@@ -16661,12 +16661,12 @@
 
     /**
      * APIMethod: getViewPortPxFromLayerPx
-     * 
+     *
      * Parameters:
      * layerPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} Layer Pixel translated into ViewPort Pixel 
+     * {<OpenLayers.Pixel>} Layer Pixel translated into ViewPort Pixel
      *                      coordinates
      */
     getViewPortPxFromLayerPx:function(layerPx) {
@@ -16674,19 +16674,19 @@
         if (layerPx != null) {
             var dX = parseInt(this.layerContainerDiv.style.left);
             var dY = parseInt(this.layerContainerDiv.style.top);
-            viewPortPx = layerPx.add(dX, dY);            
+            viewPortPx = layerPx.add(dX, dY);
         }
         return viewPortPx;
     },
-    
+
     /**
      * APIMethod: getLayerPxFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} ViewPort Pixel translated into Layer Pixel 
+     * {<OpenLayers.Pixel>} ViewPort Pixel translated into Layer Pixel
      *                      coordinates
      */
     getLayerPxFromViewPortPx:function(viewPortPx) {
@@ -16701,14 +16701,14 @@
         }
         return layerPx;
     },
-    
+
   //
   // TRANSLATION: LonLat <-> LayerPx
   //
 
     /**
      * Method: getLonLatFromLayerPx
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      *
@@ -16718,24 +16718,24 @@
     getLonLatFromLayerPx: function (px) {
        //adjust for displacement of layerContainerDiv
        px = this.getViewPortPxFromLayerPx(px);
-       return this.getLonLatFromViewPortPx(px);         
+       return this.getLonLatFromViewPortPx(px);
     },
-    
+
     /**
      * APIMethod: getLayerPxFromLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} lonlat
      *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in 
-     *                      <OpenLayers.LonLat>, translated into layer pixels 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     *                      <OpenLayers.LonLat>, translated into layer pixels
      *                      by the current base layer
      */
     getLayerPxFromLonLat: function (lonlat) {
        //adjust for displacement of layerContainerDiv
        var px = this.getPixelFromLonLat(lonlat);
-       return this.getLayerPxFromViewPortPx(px);         
+       return this.getLayerPxFromViewPortPx(px);
     },
 
     CLASS_NAME: "OpenLayers.Map"
@@ -16767,8 +16767,8 @@
 
 /**
  * Class: OpenLayers.Marker
- * Instances of OpenLayers.Marker are a combination of a 
- * <OpenLayers.LonLat> and an <OpenLayers.Icon>.  
+ * Instances of OpenLayers.Marker are a combination of a
+ * <OpenLayers.LonLat> and an <OpenLayers.Icon>.
  *
  * Markers are generally added to a special layer called
  * <OpenLayers.Layer.Markers>.
@@ -16792,32 +16792,32 @@
  * markers using that same icon.
  */
 OpenLayers.Marker = OpenLayers.Class({
-    
-    /** 
-     * Property: icon 
+
+    /**
+     * Property: icon
      * {<OpenLayers.Icon>} The icon used by this marker.
      */
     icon: null,
 
-    /** 
-     * Property: lonlat 
+    /**
+     * Property: lonlat
      * {<OpenLayers.LonLat>} location of object
      */
     lonlat: null,
-    
-    /** 
-     * Property: events 
+
+    /**
+     * Property: events
      * {<OpenLayers.Events>} the event handler.
      */
     events: null,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} the map this marker is attached to
      */
     map: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Marker
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} the position of this marker
@@ -16825,7 +16825,7 @@
      */
     initialize: function(lonlat, icon) {
         this.lonlat = lonlat;
-        
+
         var newIcon = (icon) ? icon : OpenLayers.Marker.defaultIcon();
         if (this.icon == null) {
             this.icon = newIcon;
@@ -16837,10 +16837,10 @@
         }
         this.events = new OpenLayers.Events(this, this.icon.imageDiv, null);
     },
-    
+
     /**
      * APIMethod: destroy
-     * Destroy the marker. You must first remove the marker from any 
+     * Destroy the marker. You must first remove the marker from any
      * layer which it has been added to, or you will get buggy behavior.
      * (This can not be done within the marker since the marker does not
      * know which layer it is attached to.)
@@ -16859,23 +16859,23 @@
             this.icon = null;
         }
     },
-    
-    /** 
+
+    /**
     * Method: draw
     * Calls draw on the icon, and returns that output.
-    * 
+    *
     * Parameters:
     * px - {<OpenLayers.Pixel>}
-    * 
+    *
     * Returns:
-    * {DOMElement} A new DOM Image with this marker's icon set at the 
+    * {DOMElement} A new DOM Image with this marker's icon set at the
     * location passed-in
     */
     draw: function(px) {
         return this.icon.draw(px);
-    }, 
+    },
 
-    /** 
+    /**
     * Method: erase
     * Erases any drawn elements for this marker.
     */
@@ -16883,7 +16883,7 @@
         if (this.icon != null) {
             this.icon.erase();
         }
-    }, 
+    },
 
     /**
     * Method: moveTo
@@ -16895,19 +16895,19 @@
     moveTo: function (px) {
         if ((px != null) && (this.icon != null)) {
             this.icon.moveTo(px);
-        }           
+        }
         this.lonlat = this.map.getLonLatFromLayerPx(px);
     },
 
     /**
      * APIMethod: isDrawn
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the marker is drawn.
      */
     isDrawn: function() {
         var isDrawn = (this.icon && this.icon.isDrawn());
-        return isDrawn;   
+        return isDrawn;
     },
 
     /**
@@ -16917,15 +16917,15 @@
      * {Boolean} Whether or not the marker is currently visible on screen.
      */
     onScreen:function() {
-        
+
         var onScreen = false;
         if (this.map) {
             var screenBounds = this.map.getExtent();
             onScreen = screenBounds.containsLonLat(this.lonlat);
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: inflate
      * Englarges the markers icon by the specified ratio.
@@ -16939,14 +16939,14 @@
             var newSize = new OpenLayers.Size(this.icon.size.w * inflate,
                                               this.icon.size.h * inflate);
             this.icon.setSize(newSize);
-        }        
+        }
     },
-    
-    /** 
+
+    /**
      * Method: setOpacity
-     * Change the opacity of the marker by changin the opacity of 
+     * Change the opacity of the marker by changin the opacity of
      *   its icon
-     * 
+     *
      * Parameters:
      * opacity - {float}  Specified as fraction (0.4, etc)
      */
@@ -16957,18 +16957,18 @@
     /**
      * Method: setUrl
      * Change URL of the Icon Image.
-     * 
-     * url - {String} 
+     *
+     * url - {String}
      */
     setUrl: function(url) {
         this.icon.setUrl(url);
-    },    
+    },
 
-    /** 
+    /**
      * Method: display
      * Hide or show the icon
-     * 
-     * display - {Boolean} 
+     *
+     * display - {Boolean}
      */
     display: function(display) {
         this.icon.display(display);
@@ -16981,7 +16981,7 @@
 /**
  * Function: defaultIcon
  * Creates a default <OpenLayers.Icon>.
- * 
+ *
  * Returns:
  * {<OpenLayers.Icon>} A default OpenLayers.Icon to use for a marker
  */
@@ -16992,10 +16992,10 @@
                     return new OpenLayers.Pixel(-(size.w/2), -size.h);
                  };
 
-    return new OpenLayers.Icon(url, size, null, calculateOffset);        
+    return new OpenLayers.Icon(url, size, null, calculateOffset);
 };
-    
 
+
 /* ======================================================================
     OpenLayers/Request.js
    ====================================================================== */
@@ -17015,7 +17015,7 @@
  *     W3C compliant <OpenLayers.Request.XMLHttpRequest> class.
  */
 OpenLayers.Request = {
-    
+
     /**
      * Constant: DEFAULT_CONFIG
      * {Object} Default configuration for all requests.
@@ -17035,17 +17035,17 @@
         failure: null,
         scope: null
     },
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *     events on the {<OpenLayers.Request>} object.
      *
      * All event listeners will receive an event object with three properties:
      * request - {<OpenLayers.Request.XMLHttpRequest>} The request object.
      * config - {Object} The config object sent to the specific request method.
      * requestUrl - {String} The request url.
-     * 
+     *
      * Supported event types:
      * complete - Triggered when we have a response from the request, if a
      *     listener returns false, no further response processing will take
@@ -17054,7 +17054,7 @@
      * failure - Triggered when the HTTP response does not have a success code.
      */
     events: new OpenLayers.Events(this, null, ["complete", "success", "failure"]),
-    
+
     /**
      * APIMethod: issue
      * Create a new XMLHttpRequest object, open it, set any headers, bind
@@ -17111,7 +17111,7 @@
      * {XMLHttpRequest} Request object.  To abort the request before a response
      *     is received, call abort() on the request object.
      */
-    issue: function(config) {        
+    issue: function(config) {
         // apply default config - proxy host may have changed
         var defaultConfig = OpenLayers.Util.extend(
             this.DEFAULT_CONFIG,
@@ -17143,7 +17143,7 @@
         var complete = (config.scope) ?
             OpenLayers.Function.bind(config.callback, config.scope) :
             config.callback;
-        
+
         // optional success callback
         var success;
         if(config.success) {
@@ -17159,9 +17159,9 @@
                 OpenLayers.Function.bind(config.failure, config.scope) :
                 config.failure;
         }
-        
+
         var events = this.events;
-         
+
         request.onreadystatechange = function() {
             if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
                 var proceed = events.triggerEvent(
@@ -17179,7 +17179,7 @@
                             success(request);
                         }
                     }
-                    if(request.status && (request.status < 200 || request.status >= 300)) {                    
+                    if(request.status && (request.status < 200 || request.status >= 300)) {
                         events.triggerEvent(
                             "failure",
                             {request: request, config: config, requestUrl: url}
@@ -17191,7 +17191,7 @@
                 }
             }
         };
-        
+
         // send request (optionally with data) and return
         // call in a timeout for asynchronous requests so the return is
         // available before readyState == 4 for cached docs
@@ -17204,7 +17204,7 @@
         }
         return request;
     },
-    
+
     /**
      * APIMethod: GET
      * Send an HTTP GET request.  Additional configuration properties are
@@ -17215,7 +17215,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17223,7 +17223,7 @@
         config = OpenLayers.Util.extend(config, {method: "GET"});
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: POST
      * Send a POST request.  Additional configuration properties are
@@ -17235,7 +17235,7 @@
      *     See the <issue> method for documentation of allowed properties.  The
      *     default "Content-Type" header will be set to "application-xml" if
      *     none is provided.  This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17248,7 +17248,7 @@
         }
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: PUT
      * Send an HTTP PUT request.  Additional configuration properties are
@@ -17260,7 +17260,7 @@
      *     See the <issue> method for documentation of allowed properties.  The
      *     default "Content-Type" header will be set to "application-xml" if
      *     none is provided.  This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17273,7 +17273,7 @@
         }
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: DELETE
      * Send an HTTP DELETE request.  Additional configuration properties are
@@ -17284,7 +17284,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17292,7 +17292,7 @@
         config = OpenLayers.Util.extend(config, {method: "DELETE"});
         return OpenLayers.Request.issue(config);
     },
-  
+
     /**
      * APIMethod: HEAD
      * Send an HTTP HEAD request.  Additional configuration properties are
@@ -17303,7 +17303,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17311,7 +17311,7 @@
         config = OpenLayers.Util.extend(config, {method: "HEAD"});
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: OPTIONS
      * Send an HTTP OPTIONS request.  Additional configuration properties are
@@ -17322,7 +17322,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17356,14 +17356,14 @@
  */
 OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, {
 
-    /** 
+    /**
      * Property: url
      * {String} The URL of the image being requested. No default. Filled in by
-     * layer.getURL() function. 
+     * layer.getURL() function.
      */
     url: null,
-    
-    /** 
+
+    /**
      * Property: imgDiv
      * {DOMElement} The div element which wraps the image.
      */
@@ -17372,22 +17372,22 @@
     /**
      * Property: frame
      * {DOMElement} The image element is appended to the frame.  Any gutter on
-     * the image will be hidden behind the frame. 
-     */ 
-    frame: null, 
-    
+     * the image will be hidden behind the frame.
+     */
+    frame: null,
+
     /**
      * Property: layerAlphaHack
      * {Boolean} True if the png alpha hack needs to be applied on the layer's div.
      */
     layerAlphaHack: null,
-    
+
     /**
      * Property: isBackBuffer
      * {Boolean} Is this tile a back buffer tile?
      */
     isBackBuffer: false,
-    
+
     /**
      * Property: lastRatio
      * {Float} Used in transition code only.  This is the previous ratio
@@ -17406,7 +17406,7 @@
      *     tiles that have been loaded can be used.
      */
     isFirstDraw: true,
-        
+
     /**
      * Property: backBufferTile
      * {<OpenLayers.Tile>} A clone of the tile used to create transition
@@ -17414,33 +17414,33 @@
      */
     backBufferTile: null,
 
-    /** TBD 3.0 - reorder the parameters to the init function to remove 
-     *             URL. the getUrl() function on the layer gets called on 
+    /** TBD 3.0 - reorder the parameters to the init function to remove
+     *             URL. the getUrl() function on the layer gets called on
      *             each draw(), so no need to specify it here.
-     * 
+     *
      * Constructor: OpenLayers.Tile.Image
      * Constructor for a new <OpenLayers.Tile.Image> instance.
-     * 
+     *
      * Parameters:
      * layer - {<OpenLayers.Layer>} layer that the tile will go in.
      * position - {<OpenLayers.Pixel>}
      * bounds - {<OpenLayers.Bounds>}
      * url - {<String>} Deprecated. Remove me in 3.0.
      * size - {<OpenLayers.Size>}
-     */   
+     */
     initialize: function(layer, position, bounds, url, size) {
         OpenLayers.Tile.prototype.initialize.apply(this, arguments);
 
         this.url = url; //deprecated remove me
-        
-        this.frame = document.createElement('div'); 
-        this.frame.style.overflow = 'hidden'; 
-        this.frame.style.position = 'absolute'; 
 
+        this.frame = document.createElement('div');
+        this.frame.style.overflow = 'hidden';
+        this.frame.style.position = 'absolute';
+
         this.layerAlphaHack = this.layer.alpha && OpenLayers.Util.alphaHack();
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -17448,13 +17448,13 @@
         if (this.imgDiv != null)  {
             if (this.layerAlphaHack) {
                 // unregister the "load" handler
-                OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0].id);                
+                OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0].id);
             }
 
             // unregister the "load" and "error" handlers. Only the "error" handler if
             // this.layerAlphaHack is true.
             OpenLayers.Event.stopObservingElement(this.imgDiv.id);
-            
+
             if (this.imgDiv.parentNode == this.frame) {
                 this.frame.removeChild(this.imgDiv);
                 this.imgDiv.map = null;
@@ -17464,19 +17464,19 @@
             this.imgDiv.src = OpenLayers.Util.getImagesLocation() + "blank.gif";
         }
         this.imgDiv = null;
-        if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) { 
-            this.layer.div.removeChild(this.frame); 
+        if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) {
+            this.layer.div.removeChild(this.frame);
         }
-        this.frame = null; 
-        
+        this.frame = null;
+
         /* clean up the backBufferTile if it exists */
         if (this.backBufferTile) {
             this.backBufferTile.destroy();
             this.backBufferTile = null;
         }
-        
+
         this.layer.events.unregister("loadend", this, this.resetBackBuffer);
-        
+
         OpenLayers.Tile.prototype.destroy.apply(this, arguments);
     },
 
@@ -17491,27 +17491,27 @@
      */
     clone: function (obj) {
         if (obj == null) {
-            obj = new OpenLayers.Tile.Image(this.layer, 
-                                            this.position, 
-                                            this.bounds, 
-                                            this.url, 
-                                            this.size);        
-        } 
-        
+            obj = new OpenLayers.Tile.Image(this.layer,
+                                            this.position,
+                                            this.bounds,
+                                            this.url,
+                                            this.size);
+        }
+
         //pick up properties from superclass
         obj = OpenLayers.Tile.prototype.clone.apply(this, [obj]);
-        
+
         //dont want to directly copy the image div
         obj.imgDiv = null;
-            
-        
+
+
         return obj;
     },
-    
+
     /**
      * Method: draw
      * Check that a tile should be drawn, and draw it.
-     * 
+     *
      * Returns:
      * {Boolean} Always returns true.
      */
@@ -17520,7 +17520,7 @@
             this.bounds = this.getBoundsFromBaseLayer(this.position);
         }
         var drawTile = OpenLayers.Tile.prototype.draw.apply(this, arguments);
-        
+
         if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS, this.layer.transitionEffect) != -1) {
             if (drawTile) {
                 //we use a clone of this tile to create a double buffer for visual
@@ -17534,10 +17534,10 @@
                     // the backBufferTile behind the main tile so the tiles can
                     // load over top and display as soon as they are loaded.
                     this.backBufferTile.isBackBuffer = true;
-                    
+
                     // potentially end any transition effects when the tile loads
                     this.events.register('loadend', this, this.resetBackBuffer);
-                    
+
                     // clear transition back buffer tile only after all tiles in
                     // this layer have loaded to avoid visual glitches
                     this.layer.events.register("loadend", this, this.resetBackBuffer);
@@ -17555,45 +17555,45 @@
             if (drawTile && this.isFirstDraw) {
                 this.events.register('loadend', this, this.showTile);
                 this.isFirstDraw = false;
-            }   
-        }    
-        
+            }
+        }
+
         if (!drawTile) {
             return false;
         }
-        
+
         if (this.isLoading) {
             //if we're already loading, send 'reload' instead of 'loadstart'.
-            this.events.triggerEvent("reload"); 
+            this.events.triggerEvent("reload");
         } else {
             this.isLoading = true;
             this.events.triggerEvent("loadstart");
         }
-        
+
         return this.renderTile();
     },
-    
-    /** 
+
+    /**
      * Method: resetBackBuffer
      * Triggered by two different events, layer loadend, and tile loadend.
-     *     In any of these cases, we check to see if we can hide the 
-     *     backBufferTile yet and update its parameters to match the 
+     *     In any of these cases, we check to see if we can hide the
+     *     backBufferTile yet and update its parameters to match the
      *     foreground tile.
      *
      * Basic logic:
      *  - If the backBufferTile hasn't been drawn yet, reset it
      *  - If layer is still loading, show foreground tile but don't hide
      *    the backBufferTile yet
-     *  - If layer is done loading, reset backBuffer tile and show 
+     *  - If layer is done loading, reset backBuffer tile and show
      *    foreground tile
      */
     resetBackBuffer: function() {
         this.showTile();
-        if (this.backBufferTile && 
+        if (this.backBufferTile &&
             (this.isFirstDraw || !this.layer.numLoadingTiles)) {
             this.isFirstDraw = false;
             // check to see if the backBufferTile is within the max extents
-            // before rendering it 
+            // before rendering it
             var maxExtent = this.layer.maxExtent;
             var withinMaxExtent = (maxExtent &&
                                    this.bounds.intersectsBounds(maxExtent, false));
@@ -17610,7 +17610,7 @@
             this.backBufferTile.hide();
         }
     },
-    
+
     /**
      * Method: renderTile
      * Internal function to actually initialize the image tile,
@@ -17622,7 +17622,7 @@
         }
 
         this.imgDiv.viewRequestID = this.layer.map.viewRequestID;
-        
+
         if (this.layer.async) {
             // Asyncronous image requests call the asynchronous getURL method
             // on the layer to fetch an image that covers 'this.bounds', in the scope of
@@ -17632,16 +17632,16 @@
         } else {
             // syncronous image requests get the url and position the frame immediately,
             // and don't wait for an image request to come back.
-          
+
             // needed for changing to a different server for onload error
             if (this.layer.url instanceof Array) {
                 this.imgDiv.urls = this.layer.url.slice();
             }
-          
+
             this.url = this.layer.getURL(this.bounds);
-          
+
             // position the frame immediately
-            this.positionImage(); 
+            this.positionImage();
         }
         return true;
     },
@@ -17657,12 +17657,12 @@
         // returned, do not attempt to use it for size computation
         if ( this.layer == null )
             return;
-        
-        // position the frame 
-        OpenLayers.Util.modifyDOMElement(this.frame, 
-                                          null, this.position, this.size);   
 
-        var imageSize = this.layer.getImageSize(); 
+        // position the frame
+        OpenLayers.Util.modifyDOMElement(this.frame,
+                                          null, this.position, this.size);
+
+        var imageSize = this.layer.getImageSize();
         if (this.layerAlphaHack) {
             OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,
                     null, null, imageSize, this.url);
@@ -17673,17 +17673,17 @@
         }
     },
 
-    /** 
+    /**
      * Method: clear
-     *  Clear the tile of any bounds/position-related data so that it can 
+     *  Clear the tile of any bounds/position-related data so that it can
      *   be reused in a new location.
      */
     clear: function() {
         if(this.imgDiv) {
             this.hide();
-            if (OpenLayers.Tile.Image.useBlankTile) { 
+            if (OpenLayers.Tile.Image.useBlankTile) {
                 this.imgDiv.src = OpenLayers.Util.getImagesLocation() + "blank.gif";
-            }    
+            }
         }
     },
 
@@ -17692,10 +17692,10 @@
      * Creates the imgDiv property on the tile.
      */
     initImgDiv: function() {
-        
-        var offset = this.layer.imageOffset; 
-        var size = this.layer.getImageSize(); 
-     
+
+        var offset = this.layer.imageOffset;
+        var size = this.layer.getImageSize();
+
         if (this.layerAlphaHack) {
             this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
                                                            offset,
@@ -17716,7 +17716,7 @@
                                                       null,
                                                       true);
         }
-        
+
         this.imgDiv.className = 'olTileImage';
 
         /* checkImgURL used to be used to called as a work around, but it
@@ -17728,43 +17728,43 @@
             OpenLayers.Function.bind(this.checkImgURL, this) );
         */
         this.frame.style.zIndex = this.isBackBuffer ? 0 : 1;
-        this.frame.appendChild(this.imgDiv); 
-        this.layer.div.appendChild(this.frame); 
+        this.frame.appendChild(this.imgDiv);
+        this.layer.div.appendChild(this.frame);
 
         if(this.layer.opacity != null) {
-            
+
             OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
-                                             null, null, null, 
+                                             null, null, null,
                                              this.layer.opacity);
         }
 
         // we need this reference to check back the viewRequestID
         this.imgDiv.map = this.layer.map;
 
-        //bind a listener to the onload of the image div so that we 
+        //bind a listener to the onload of the image div so that we
         // can register when a tile has finished loading.
         var onload = function() {
-            
-            //normally isLoading should always be true here but there are some 
+
+            //normally isLoading should always be true here but there are some
             // right funky conditions where loading and then reloading a tile
-            // with the same url *really*fast*. this check prevents sending 
+            // with the same url *really*fast*. this check prevents sending
             // a 'loadend' if the msg has already been sent
             //
-            if (this.isLoading) { 
-                this.isLoading = false; 
-                this.events.triggerEvent("loadend"); 
+            if (this.isLoading) {
+                this.isLoading = false;
+                this.events.triggerEvent("loadend");
             }
         };
-        
-        if (this.layerAlphaHack) { 
-            OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load', 
-                                     OpenLayers.Function.bind(onload, this));    
-        } else { 
-            OpenLayers.Event.observe(this.imgDiv, 'load', 
-                                 OpenLayers.Function.bind(onload, this)); 
-        } 
-        
 
+        if (this.layerAlphaHack) {
+            OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load',
+                                     OpenLayers.Function.bind(onload, this));
+        } else {
+            OpenLayers.Event.observe(this.imgDiv, 'load',
+                                 OpenLayers.Function.bind(onload, this));
+        }
+
+
         // Bind a listener to the onerror of the image div so that we
         // can registere when a tile has finished loading with errors.
         var onerror = function() {
@@ -17790,18 +17790,18 @@
      * the imgDiv display to 'none', as either (a) it will be reset to visible
      * when the new URL loads in the image, or (b) we don't want to display
      * this tile after all because its new bounds are outside our maxExtent.
-     * 
+     *
      * This function should no longer  be neccesary with the improvements to
      * Grid.js in OpenLayers 2.3. The lack of a good isEquivilantURL function
-     * caused problems in 2.2, but it's possible that with the improved 
+     * caused problems in 2.2, but it's possible that with the improved
      * isEquivilant URL function, this might be neccesary at some point.
-     * 
-     * See discussion in the thread at 
+     *
+     * See discussion in the thread at
      * http://openlayers.org/pipermail/dev/2007-January/000205.html
      */
     checkImgURL: function () {
         // Sometimes our image will load after it has already been removed
-        // from the map, in which case this check is not needed.  
+        // from the map, in which case this check is not needed.
         if (this.layer) {
             var loaded = this.layerAlphaHack ? this.imgDiv.firstChild.src : this.imgDiv.src;
             if (!OpenLayers.Util.isEquivalentUrl(loaded, this.url)) {
@@ -17809,7 +17809,7 @@
             }
         }
     },
-    
+
     /**
      * Method: startTransition
      * This method is invoked on tiles that are backBuffers for tiles in the
@@ -17831,15 +17831,15 @@
         if (this.backBufferTile.resolution) {
             ratio = this.backBufferTile.resolution / this.layer.getResolution();
         }
-        
+
         // if the ratio is not the same as it was last time (i.e. we are
         // zooming), then we need to adjust the backBuffer tile
         if (ratio != this.lastRatio) {
             if (this.layer.transitionEffect == 'resize') {
-                // In this case, we can just immediately resize the 
+                // In this case, we can just immediately resize the
                 // backBufferTile.
                 var upperLeft = new OpenLayers.LonLat(
-                    this.backBufferTile.bounds.left, 
+                    this.backBufferTile.bounds.left,
                     this.backBufferTile.bounds.top
                 );
                 var size = new OpenLayers.Size(
@@ -17848,10 +17848,10 @@
                 );
 
                 var px = this.layer.map.getLayerPxFromLonLat(upperLeft);
-                OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame, 
+                OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,
                                                  null, px, size);
                 var imageSize = this.backBufferTile.imageSize;
-                imageSize = new OpenLayers.Size(imageSize.w * ratio, 
+                imageSize = new OpenLayers.Size(imageSize.w * ratio,
                                                 imageSize.h * ratio);
                 var imageOffset = this.backBufferTile.imageOffset;
                 if(imageOffset) {
@@ -17880,8 +17880,8 @@
         this.lastRatio = ratio;
 
     },
-    
-    /** 
+
+    /**
      * Method: show
      * Show the tile by showing its frame.
      */
@@ -17889,29 +17889,29 @@
         this.frame.style.display = '';
         // Force a reflow on gecko based browsers to actually show the element
         // before continuing execution.
-        if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS, 
+        if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,
                 this.layer.transitionEffect) != -1) {
-            if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) { 
-                this.frame.scrollLeft = this.frame.scrollLeft; 
-            } 
+            if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) {
+                this.frame.scrollLeft = this.frame.scrollLeft;
+            }
         }
     },
-    
-    /** 
+
+    /**
      * Method: hide
      * Hide the tile by hiding its frame.
      */
     hide: function() {
         this.frame.style.display = 'none';
     },
-    
+
     CLASS_NAME: "OpenLayers.Tile.Image"
   }
 );
 
-OpenLayers.Tile.Image.useBlankTile = ( 
-    OpenLayers.Util.getBrowserName() == "safari" || 
-    OpenLayers.Util.getBrowserName() == "opera"); 
+OpenLayers.Tile.Image.useBlankTile = (
+    OpenLayers.Util.getBrowserName() == "safari" ||
+    OpenLayers.Util.getBrowserName() == "opera");
 /* ======================================================================
     OpenLayers/Control/OverviewMap.js
    ====================================================================== */
@@ -17920,7 +17920,7 @@
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
 
-/** 
+/**
  * @requires OpenLayers/Control.js
  * @requires OpenLayers/BaseTypes.js
  * @requires OpenLayers/Events.js
@@ -17928,8 +17928,8 @@
 
 /**
  * Class: OpenLayers.Control.OverviewMap
- * The OverMap control creates a small overview map, useful to display the 
- * extent of a zoomed map and your main map and provide additional 
+ * The OverMap control creates a small overview map, useful to display the
+ * extent of a zoomed map and your main map and provide additional
  * navigation options to the User.  By default the overview map is drawn in
  * the lower right corner of the main map. Create a new overview map with the
  * <OpenLayers.Control.OverviewMap> constructor.
@@ -17944,7 +17944,7 @@
      * {DOMElement} The DOM element that contains the overview map
      */
     element: null,
-    
+
     /**
      * APIProperty: ovmap
      * {<OpenLayers.Map>} A reference to the overview map itself.
@@ -17966,7 +17966,7 @@
      * If none are sent at construction, the base layer for the main map is used.
      */
     layers: null,
-    
+
     /**
      * APIProperty: minRectSize
      * {Integer} The minimum width or height (in pixels) of the extent
@@ -17975,7 +17975,7 @@
      *     <minRectDisplayClass> property.  Default is 15 pixels.
      */
     minRectSize: 15,
-    
+
     /**
      * APIProperty: minRectDisplayClass
      * {String} Replacement style class name for the extent rectangle when
@@ -18008,7 +18008,7 @@
      *     resolution at which to zoom farther in on the overview map.
      */
     maxRatio: 32,
-    
+
     /**
      * APIProperty: mapOptions
      * {Object} An object containing any non-default properties to be sent to
@@ -18025,7 +18025,7 @@
      *     to the center.
      */
     autoPan: false,
-    
+
     /**
      * Property: handlers
      * {Object}
@@ -18052,7 +18052,7 @@
         this.handlers = {};
         OpenLayers.Control.prototype.initialize.apply(this, [options]);
     },
-    
+
     /**
      * APIMethod: destroy
      * Deconstruct the control
@@ -18070,7 +18070,7 @@
 
         this.ovmap.destroy();
         this.ovmap = null;
-        
+
         this.element.removeChild(this.mapDiv);
         this.mapDiv = null;
 
@@ -18082,26 +18082,26 @@
             this.div.removeChild(this.maximizeDiv);
             this.maximizeDiv = null;
         }
-        
+
         if (this.minimizeDiv) {
             OpenLayers.Event.stopObservingElement(this.minimizeDiv);
             this.div.removeChild(this.minimizeDiv);
             this.minimizeDiv = null;
         }
-        
+
         this.map.events.un({
             "moveend": this.update,
             "changebaselayer": this.baseLayerDraw,
             scope: this
         });
 
-        OpenLayers.Control.prototype.destroy.apply(this, arguments);    
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
     },
 
     /**
      * Method: draw
      * Render the control in the browser.
-     */    
+     */
     draw: function() {
         OpenLayers.Control.prototype.draw.apply(this, arguments);
         if(!(this.layers.length > 0)) {
@@ -18125,14 +18125,14 @@
         this.mapDiv.style.position = 'relative';
         this.mapDiv.style.overflow = 'hidden';
         this.mapDiv.id = OpenLayers.Util.createUniqueID('overviewMap');
-        
+
         this.extentRectangle = document.createElement('div');
         this.extentRectangle.style.position = 'absolute';
         this.extentRectangle.style.zIndex = 1000;  //HACK
         this.extentRectangle.className = this.displayClass+'ExtentRectangle';
         this.mapDiv.appendChild(this.extentRectangle);
 
-        this.element.appendChild(this.mapDiv);  
+        this.element.appendChild(this.mapDiv);
 
         this.div.appendChild(this.element);
 
@@ -18144,48 +18144,48 @@
             // maximize button div
             var img = imgLocation + 'layer-switcher-maximize.png';
             this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(
-                                        this.displayClass + 'MaximizeButton', 
-                                        null, 
-                                        new OpenLayers.Size(18,18), 
-                                        img, 
+                                        this.displayClass + 'MaximizeButton',
+                                        null,
+                                        new OpenLayers.Size(18,18),
+                                        img,
                                         'absolute');
             this.maximizeDiv.style.display = 'none';
             this.maximizeDiv.className = this.displayClass + 'MaximizeButton';
-            OpenLayers.Event.observe(this.maximizeDiv, 'click', 
+            OpenLayers.Event.observe(this.maximizeDiv, 'click',
                 OpenLayers.Function.bindAsEventListener(this.maximizeControl,
                                                         this)
             );
             this.div.appendChild(this.maximizeDiv);
-    
+
             // minimize button div
             var img = imgLocation + 'layer-switcher-minimize.png';
             this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv(
-                                        'OpenLayers_Control_minimizeDiv', 
-                                        null, 
-                                        new OpenLayers.Size(18,18), 
-                                        img, 
+                                        'OpenLayers_Control_minimizeDiv',
+                                        null,
+                                        new OpenLayers.Size(18,18),
+                                        img,
                                         'absolute');
             this.minimizeDiv.style.display = 'none';
             this.minimizeDiv.className = this.displayClass + 'MinimizeButton';
-            OpenLayers.Event.observe(this.minimizeDiv, 'click', 
+            OpenLayers.Event.observe(this.minimizeDiv, 'click',
                 OpenLayers.Function.bindAsEventListener(this.minimizeControl,
                                                         this)
             );
             this.div.appendChild(this.minimizeDiv);
-            
+
             var eventsToStop = ['dblclick','mousedown'];
-            
+
             for (var i=0, len=eventsToStop.length; i<len; i++) {
 
-                OpenLayers.Event.observe(this.maximizeDiv, 
-                                         eventsToStop[i], 
+                OpenLayers.Event.observe(this.maximizeDiv,
+                                         eventsToStop[i],
                                          OpenLayers.Event.stop);
 
                 OpenLayers.Event.observe(this.minimizeDiv,
-                                         eventsToStop[i], 
+                                         eventsToStop[i],
                                          OpenLayers.Event.stop);
             }
-            
+
             this.minimizeControl();
         } else {
             // show the overview map
@@ -18194,12 +18194,12 @@
         if(this.map.getExtent()) {
             this.update();
         }
-        
+
         this.map.events.register('moveend', this, this.update);
 
         return this.div;
     },
-    
+
     /**
      * Method: baseLayerDraw
      * Draw the base layer - called if unable to complete in the initial draw
@@ -18237,7 +18237,7 @@
                                                        newTop));
         }
     },
-    
+
     /**
      * Method: mapDivClick
      * Handle browser events
@@ -18275,15 +18275,15 @@
         this.element.style.display = '';
         this.showToggle(false);
         if (e != null) {
-            OpenLayers.Event.stop(e);                                            
+            OpenLayers.Event.stop(e);
         }
     },
 
     /**
      * Method: minimizeControl
-     * Hide all the contents of the control, shrink the size, 
+     * Hide all the contents of the control, shrink the size,
      * add the maximize icon
-     * 
+     *
      * Parameters:
      * e - {<OpenLayers.Event>}
      */
@@ -18291,7 +18291,7 @@
         this.element.style.display = 'none';
         this.showToggle(true);
         if (e != null) {
-            OpenLayers.Event.stop(e);                                            
+            OpenLayers.Event.stop(e);
         }
     },
 
@@ -18300,7 +18300,7 @@
      * Hide/Show the toggle depending on whether the control is minimized
      *
      * Parameters:
-     * minimize - {Boolean} 
+     * minimize - {Boolean}
      */
     showToggle: function(minimize) {
         this.maximizeDiv.style.display = minimize ? '' : 'none';
@@ -18315,15 +18315,15 @@
         if(this.ovmap == null) {
             this.createMap();
         }
-        
+
         if(this.autoPan || !this.isSuitableOverview()) {
             this.updateOverview();
         }
-        
+
         // update extent rectangle
         this.updateRectToMap();
     },
-    
+
     /**
      * Method: isSuitableOverview
      * Determines if the overview map is suitable given the extent and
@@ -18336,7 +18336,7 @@
                                 Math.max(mapExtent.left, maxExtent.left),
                                 Math.max(mapExtent.bottom, maxExtent.bottom),
                                 Math.min(mapExtent.right, maxExtent.right),
-                                Math.min(mapExtent.top, maxExtent.top));        
+                                Math.min(mapExtent.top, maxExtent.top));
 
         if (this.ovmap.getProjection() != this.map.getProjection()) {
             testExtent = testExtent.transform(
@@ -18349,7 +18349,7 @@
                 (resRatio <= this.maxRatio) &&
                 (this.ovmap.getExtent().containsBounds(testExtent)));
     },
-    
+
     /**
      * Method updateOverview
      * Called by <update> if <isSuitableOverview> returns true
@@ -18360,7 +18360,7 @@
         var resRatio = targetRes / mapRes;
         if(resRatio > this.maxRatio) {
             // zoom in overview map
-            targetRes = this.minRatio * mapRes;            
+            targetRes = this.minRatio * mapRes;
         } else if(resRatio <= this.minRatio) {
             // zoom out overview map
             targetRes = this.maxRatio * mapRes;
@@ -18377,7 +18377,7 @@
             targetRes * this.resolutionFactor));
         this.updateRectToMap();
     },
-    
+
     /**
      * Method: createMap
      * Construct the map that this control contains
@@ -18385,14 +18385,14 @@
     createMap: function() {
         // create the overview map
         var options = OpenLayers.Util.extend(
-                        {controls: [], maxResolution: 'auto', 
+                        {controls: [], maxResolution: 'auto',
                          fallThrough: false}, this.mapOptions);
         this.ovmap = new OpenLayers.Map(this.mapDiv, options);
-        
+
         // prevent ovmap from being destroyed when the page unloads, because
         // the OverviewMap control has to do this (and does it).
         OpenLayers.Event.stopObserving(window, 'unload', this.ovmap.unloadDestroy);
-        
+
         this.ovmap.addLayers(this.layers);
         this.ovmap.zoomToMaxExtent();
         // check extent rectangle border width
@@ -18422,7 +18422,7 @@
             }
         );
         this.handlers.click.activate();
-        
+
         this.rectEvents = new OpenLayers.Events(this, this.extentRectangle,
                                                 null, true);
         this.rectEvents.register("mouseover", this, function(e) {
@@ -18446,7 +18446,7 @@
                 OpenLayers.INCHES_PER_UNIT[targetUnits] : 1;
         }
     },
-        
+
     /**
      * Method: updateRectToMap
      * Updates the extent rectangle position and size to match the map extent
@@ -18456,7 +18456,7 @@
         var bounds;
         if (this.ovmap.getProjection() != this.map.getProjection()) {
             bounds = this.map.getExtent().transform(
-                this.map.getProjectionObject(), 
+                this.map.getProjectionObject(),
                 this.ovmap.getProjectionObject() );
         } else {
             bounds = this.map.getExtent();
@@ -18466,7 +18466,7 @@
             this.setRectPxBounds(pxBounds);
         }
     },
-    
+
     /**
      * Method: updateMapToRect
      * Updates the map extent to match the extent rectangle position and size
@@ -18583,12 +18583,12 @@
         var size = this.ovmap.size;
         var res  = this.ovmap.getResolution();
         var center = this.ovmap.getExtent().getCenterLonLat();
-    
+
         var delta_x = overviewMapPx.x - (size.w / 2);
         var delta_y = overviewMapPx.y - (size.h / 2);
-        
+
         return new OpenLayers.LonLat(center.lon + delta_x * res ,
-                                     center.lat - delta_y * res); 
+                                     center.lat - delta_y * res);
     },
 
     /**
@@ -18599,7 +18599,7 @@
      * lonlat - {<OpenLayers.LonLat>}
      *
      * Returns:
-     * {<OpenLayers.Pixel>} Location which is the passed-in OpenLayers.LonLat, 
+     * {<OpenLayers.Pixel>} Location which is the passed-in OpenLayers.LonLat,
      * translated into overview map pixels
      */
     getOverviewPxFromLonLat: function(lonlat) {
@@ -18610,7 +18610,7 @@
             px = new OpenLayers.Pixel(
                         Math.round(1/res * (lonlat.lon - extent.left)),
                         Math.round(1/res * (extent.top - lonlat.lat)));
-        } 
+        }
         return px;
     },
 
@@ -18638,33 +18638,33 @@
  */
 OpenLayers.Feature = OpenLayers.Class({
 
-    /** 
-     * Property: layer 
-     * {<OpenLayers.Layer>} 
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer>}
      */
     layer: null,
 
-    /** 
-     * Property: id 
-     * {String} 
+    /**
+     * Property: id
+     * {String}
      */
     id: null,
-    
-    /** 
-     * Property: lonlat 
-     * {<OpenLayers.LonLat>} 
+
+    /**
+     * Property: lonlat
+     * {<OpenLayers.LonLat>}
      */
     lonlat: null,
 
-    /** 
-     * Property: data 
-     * {Object} 
+    /**
+     * Property: data
+     * {Object}
      */
     data: null,
 
-    /** 
-     * Property: marker 
-     * {<OpenLayers.Marker>} 
+    /**
+     * Property: marker
+     * {<OpenLayers.Marker>}
      */
     marker: null,
 
@@ -18675,21 +18675,21 @@
      */
     popupClass: OpenLayers.Popup.AnchoredBubble,
 
-    /** 
-     * Property: popup 
-     * {<OpenLayers.Popup>} 
+    /**
+     * Property: popup
+     * {<OpenLayers.Popup>}
      */
     popup: null,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Feature
      * Constructor for features.
      *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
-     * lonlat - {<OpenLayers.LonLat>} 
-     * data - {Object} 
-     * 
+     * layer - {<OpenLayers.Layer>}
+     * lonlat - {<OpenLayers.LonLat>}
+     * data - {Object}
+     *
      * Returns:
      * {<OpenLayers.Feature>}
      */
@@ -18697,10 +18697,10 @@
         this.layer = layer;
         this.lonlat = lonlat;
         this.data = (data != null) ? data : {};
-        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"); 
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
 
-    /** 
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -18726,36 +18726,36 @@
             this.popup = null;
         }
     },
-    
+
     /**
      * Method: onScreen
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the feature is currently visible on screen
      *           (based on its 'lonlat' property)
      */
     onScreen:function() {
-        
+
         var onScreen = false;
         if ((this.layer != null) && (this.layer.map != null)) {
             var screenBounds = this.layer.map.getExtent();
             onScreen = screenBounds.containsLonLat(this.lonlat);
-        }    
+        }
         return onScreen;
     },
-    
 
+
     /**
      * Method: createMarker
      * Based on the data associated with the Feature, create and return a marker object.
      *
-     * Returns: 
+     * Returns:
      * {<OpenLayers.Marker>} A Marker Object created from the 'lonlat' and 'icon' properties
      *          set in this.data. If no 'lonlat' is set, returns null. If no
      *          'icon' is set, OpenLayers.Marker() will load the default image.
-     *          
+     *
      *          Note - this.marker is set to return value
-     * 
+     *
      */
     createMarker: function() {
 
@@ -18772,64 +18772,64 @@
      *   to also specify an alternative function for destroying it
      */
     destroyMarker: function() {
-        this.marker.destroy();  
+        this.marker.destroy();
     },
 
     /**
      * Method: createPopup
      * Creates a popup object created from the 'lonlat', 'popupSize',
      *     and 'popupContentHTML' properties set in this.data. It uses
-     *     this.marker.icon as default anchor. 
-     *  
-     *  If no 'lonlat' is set, returns null. 
+     *     this.marker.icon as default anchor.
+     *
+     *  If no 'lonlat' is set, returns null.
      *  If no this.marker has been created, no anchor is sent.
      *
      *  Note - the returned popup object is 'owned' by the feature, so you
      *      cannot use the popup's destroy method to discard the popup.
      *      Instead, you must use the feature's destroyPopup
-     * 
+     *
      *  Note - this.popup is set to return value
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * closeBox - {Boolean} create popup with closebox or not
-     * 
+     *
      * Returns:
      * {<OpenLayers.Popup>} Returns the created popup, which is also set
      *     as 'popup' property of this feature. Will be of whatever type
      *     specified by this feature's 'popupClass' property, but must be
      *     of type <OpenLayers.Popup>.
-     * 
+     *
      */
     createPopup: function(closeBox) {
 
         if (this.lonlat != null) {
-            
+
             var id = this.id + "_popup";
             var anchor = (this.marker) ? this.marker.icon : null;
 
             if (!this.popup) {
-                this.popup = new this.popupClass(id, 
+                this.popup = new this.popupClass(id,
                                                  this.lonlat,
                                                  this.data.popupSize,
                                                  this.data.popupContentHTML,
-                                                 anchor, 
-                                                 closeBox); 
-            }    
+                                                 anchor,
+                                                 closeBox);
+            }
             if (this.data.overflow != null) {
                 this.popup.contentDiv.style.overflow = this.data.overflow;
-            }    
-            
+            }
+
             this.popup.feature = this;
-        }        
+        }
         return this.popup;
     },
 
-    
+
     /**
      * Method: destroyPopup
      * Destroys the popup created via createPopup.
      *
-     * As with the marker, if user overrides the createPopup() function, s/he 
+     * As with the marker, if user overrides the createPopup() function, s/he
      *   should also be able to override the destruction
      */
     destroyPopup: function() {
@@ -18837,7 +18837,7 @@
             this.popup.feature = null;
             this.popup.destroy();
             this.popup = null;
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Feature"
@@ -18847,7 +18847,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the clear BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt
  * for the full text of the license. */
 
 /**
@@ -18864,9 +18864,9 @@
  *     click.  By setting a <pixelTolerance>, controls can also ignore clicks
  *     that include a drag.  Create a new instance with the
  *     <OpenLayers.Handler.Click> constructor.
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, {
 
@@ -18876,20 +18876,20 @@
      *     considered a double-click.
      */
     delay: 300,
-    
+
     /**
      * APIProperty: single
      * {Boolean} Handle single clicks.  Default is true.  If false, clicks
      * will not be reported.  If true, single-clicks will be reported.
      */
     single: true,
-    
+
     /**
      * APIProperty: double
      * {Boolean} Handle double-clicks.  Default is false.
      */
     'double': false,
-    
+
     /**
      * APIProperty: pixelTolerance
      * {Number} Maximum number of pixels between mouseup and mousedown for an
@@ -18899,7 +18899,7 @@
      *     constructed.
      */
     pixelTolerance: 0,
-    
+
     /**
      * APIProperty: stopSingle
      * {Boolean} Stop other listeners from being notified of clicks.  Default
@@ -18908,13 +18908,13 @@
      *     or single clicks).
      */
     stopSingle: false,
-    
+
     /**
      * APIProperty: stopDouble
      * {Boolean} Stop other listeners from being notified of double-clicks.
      *     Default is false.  If true, any click listeners registered before
      *     this one will not be notified of *any* double-click events.
-     * 
+     *
      * The one caveat with stopDouble is that given a map with two click
      *     handlers, one with stopDouble true and the other with stopSingle
      *     true, the stopSingle handler should be activated last to get
@@ -18930,24 +18930,24 @@
      * {Number} The id of the timeout waiting to clear the <delayedCall>.
      */
     timerId: null,
-    
+
     /**
      * Property: down
      * {<OpenLayers.Pixel>} The pixel location of the last mousedown.
      */
     down: null,
-    
+
     /**
      * Property: rightclickTimerId
-     * {Number} The id of the right mouse timeout waiting to clear the 
+     * {Number} The id of the right mouse timeout waiting to clear the
      *     <delayedEvent>.
      */
     rightclickTimerId: null,
-    
+
     /**
      * Constructor: OpenLayers.Handler.Click
      * Create a new click handler.
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control that is making use of
      *     this handler.  If a handler is being used without a control, the
@@ -18970,7 +18970,7 @@
             };
         }
     },
-    
+
     /**
      * Method: mousedown
      * Handle mousedown.  Only registered as a listener if pixelTolerance is
@@ -18984,7 +18984,7 @@
     /**
      * Method: mouseup
      * Handle mouseup.  Installed to support collection of right mouse events.
-     * 
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
@@ -18994,55 +18994,55 @@
         // Collect right mouse clicks from the mouseup
         //  IE - ignores the second right click in mousedown so using
         //  mouseup instead
-        if (this.checkModifiers(evt) && 
-            this.control.handleRightClicks && 
+        if (this.checkModifiers(evt) &&
+            this.control.handleRightClicks &&
             OpenLayers.Event.isRightClick(evt)) {
           propagate = this.rightclick(evt);
         }
 
         return propagate;
     },
-    
+
     /**
      * Method: rightclick
-     * Handle rightclick.  For a dblrightclick, we get two clicks so we need 
-     *     to always register for dblrightclick to properly handle single 
+     * Handle rightclick.  For a dblrightclick, we get two clicks so we need
+     *     to always register for dblrightclick to properly handle single
      *     clicks.
-     *     
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
     rightclick: function(evt) {
         if(this.passesTolerance(evt)) {
            if(this.rightclickTimerId != null) {
-                //Second click received before timeout this must be 
+                //Second click received before timeout this must be
                 // a double click
-                this.clearTimer();      
+                this.clearTimer();
                 this.callback('dblrightclick', [evt]);
                 return !this.stopDouble;
-            } else { 
-                //Set the rightclickTimerId, send evt only if double is 
+            } else {
+                //Set the rightclickTimerId, send evt only if double is
                 // true else trigger single
                 var clickEvent = this['double'] ?
-                    OpenLayers.Util.extend({}, evt) : 
+                    OpenLayers.Util.extend({}, evt) :
                     this.callback('rightclick', [evt]);
 
                 var delayedRightCall = OpenLayers.Function.bind(
-                    this.delayedRightCall, 
-                    this, 
+                    this.delayedRightCall,
+                    this,
                     clickEvent
                 );
                 this.rightclickTimerId = window.setTimeout(
                     delayedRightCall, this.delay
                 );
-            } 
+            }
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: delayedRightCall
-     * Sets <rightclickTimerId> to null.  And optionally triggers the 
+     * Sets <rightclickTimerId> to null.  And optionally triggers the
      *     rightclick callback if evt is set.
      */
     delayedRightCall: function(evt) {
@@ -19052,13 +19052,13 @@
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: dblclick
      * Handle dblclick.  For a dblclick, we get two clicks in some browsers
      *     (FF) and one in others (IE).  So we need to always register for
      *     dblclick to properly handle single clicks.
-     *     
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
@@ -19071,7 +19071,7 @@
         }
         return !this.stopDouble;
     },
-    
+
     /**
      * Method: click
      * Handle click.
@@ -19086,7 +19086,7 @@
                 this.clearTimer();
             } else {
                 // set the timer, send evt only if single is true
-                //use a clone of the event object because it will no longer 
+                //use a clone of the event object because it will no longer
                 //be a valid event object in IE in the timer callback
                 var clickEvent = this.single ?
                     OpenLayers.Util.extend({}, evt) : null;
@@ -19098,7 +19098,7 @@
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: passesTolerance
      * Determine whether the event is within the optional pixel tolerance.  Note
@@ -19138,7 +19138,7 @@
             this.rightclickTimerId = null;
         }
     },
-    
+
     /**
      * Method: delayedCall
      * Sets <timerId> to null.  And optionally triggers the click callback if
@@ -19204,14 +19204,14 @@
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, {
-  
-    /** 
+
+    /**
      * Property: started
      * {Boolean} When a mousedown event is received, we want to record it, but
-     *     not set 'dragging' until the mouse moves after starting. 
+     *     not set 'dragging' until the mouse moves after starting.
      */
     started: false,
-    
+
     /**
      * Property: stopDown
      * {Boolean} Stop propagation of mousedown events from getting to listeners
@@ -19219,19 +19219,19 @@
      */
     stopDown: true,
 
-    /** 
-     * Property: dragging 
-     * {Boolean} 
+    /**
+     * Property: dragging
+     * {Boolean}
      */
     dragging: false,
 
-    /** 
+    /**
      * Property: last
      * {<OpenLayers.Pixel>} The last pixel location of the drag.
      */
     last: null,
 
-    /** 
+    /**
      * Property: start
      * {<OpenLayers.Pixel>} The first pixel location of the drag.
      */
@@ -19242,17 +19242,17 @@
      * {Function}
      */
     oldOnselectstart: null,
-    
+
     /**
      * Property: interval
-     * {Integer} In order to increase performance, an interval (in 
-     *     milliseconds) can be set to reduce the number of drag events 
-     *     called. If set, a new drag event will not be set until the 
-     *     interval has passed. 
-     *     Defaults to 0, meaning no interval. 
+     * {Integer} In order to increase performance, an interval (in
+     *     milliseconds) can be set to reduce the number of drag events
+     *     called. If set, a new drag event will not be set until the
+     *     interval has passed.
+     *     Defaults to 0, meaning no interval.
      */
     interval: 0,
-    
+
     /**
      * Property: timeoutId
      * {String} The id of the timeout used for the mousedown interval.
@@ -19263,7 +19263,7 @@
     /**
      * Constructor: OpenLayers.Handler.Drag
      * Returns OpenLayers.Handler.Drag
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control that is making use of
      *     this handler.  If a handler is being used without a control, the
@@ -19274,17 +19274,17 @@
      *     expect to recieve a single argument, the pixel location of the event.
      *     Callbacks for 'move' and 'done' are supported. You can also speficy
      *     callbacks for 'down', 'up', and 'out' to respond to those events.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * The four methods below (down, move, up, and out) are used by subclasses
      *     to do their own processing related to these mouse events.
      */
-    
+
     /**
      * Method: down
      * This method is called during the handling of the mouse down event.
@@ -19295,7 +19295,7 @@
      */
     down: function(evt) {
     },
-    
+
     /**
      * Method: move
      * This method is called during the handling of the mouse move event.
@@ -19341,7 +19341,7 @@
      * Handle mousedown events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19359,12 +19359,12 @@
             this.down(evt);
             this.callback("down", [evt.xy]);
             OpenLayers.Event.stop(evt);
-            
+
             if(!this.oldOnselectstart) {
                 this.oldOnselectstart = (document.onselectstart) ? document.onselectstart : function() { return true; };
                 document.onselectstart = function() {return false;};
             }
-            
+
             propagate = !this.stopDown;
         } else {
             this.started = false;
@@ -19379,7 +19379,7 @@
      * Handle mousemove events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19400,7 +19400,7 @@
         }
         return true;
     },
-    
+
     /**
      * Method: removeTimeout
      * Private. Called by mousemove() to remove the drag timeout.
@@ -19414,7 +19414,7 @@
      * Handle mouseup events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19442,7 +19442,7 @@
      * Handle mouseout events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19450,7 +19450,7 @@
     mouseout: function (evt) {
         if (this.started && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
             var dragged = (this.start != this.last);
-            this.started = false; 
+            this.started = false;
             this.dragging = false;
             OpenLayers.Element.removeClass(
                 this.map.viewPortDiv, "olDragDown"
@@ -19470,12 +19470,12 @@
     /**
      * Method: click
      * The drag handler captures the click event.  If something else registers
-     *     for clicks on the same element, its listener will not be called 
+     *     for clicks on the same element, its listener will not be called
      *     after a drag.
-     * 
-     * Parameters: 
-     * evt - {Event} 
-     * 
+     *
+     * Parameters:
+     * evt - {Event}
+     *
      * Returns:
      * {Boolean} Let the event propagate.
      */
@@ -19487,7 +19487,7 @@
     /**
      * Method: activate
      * Activate the handler.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was successfully activated.
      */
@@ -19501,9 +19501,9 @@
     },
 
     /**
-     * Method: deactivate 
+     * Method: deactivate
      * Deactivate the handler.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was successfully deactivated.
      */
@@ -19538,7 +19538,7 @@
  */
 
 /**
- * Class: OpenLayers.Handler.Feature 
+ * Class: OpenLayers.Handler.Feature
  * Handler to respond to mouse events related to a drawn feature.  Callbacks
  *     with the following keys will be notified of the following events
  *     associated with features: click, clickout, over, out, and dblclick.
@@ -19584,7 +19584,7 @@
      * {<OpenLayers.Pixel>} The location of the last mouseup.
      */
     up: null,
-    
+
     /**
      * Property: clickTolerance
      * {Number} The number of pixels the mouse can move between mousedown
@@ -19598,7 +19598,7 @@
      * Property: geometryTypes
      * To restrict dragging to a limited set of geometry types, send a list
      * of strings corresponding to the geometry class names.
-     * 
+     *
      * @type Array(String)
      */
     geometryTypes: null,
@@ -19629,17 +19629,17 @@
      *      value of stopUp. Defaults to false.
      */
     stopUp: false,
-    
+
     /**
      * Constructor: OpenLayers.Handler.Feature
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * layer - {<OpenLayers.Layer.Vector>}
      * callbacks - {Object} An object with a 'over' property whos value is
-     *     a function to be called when the mouse is over a feature. The 
+     *     a function to be called when the mouse is over a feature. The
      *     callback should expect to recieve a single argument, the feature.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, layer, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, [control, callbacks, options]);
@@ -19651,22 +19651,22 @@
      * Method: mousedown
      * Handle mouse down.  Stop propagation if a feature is targeted by this
      *     event (stops map dragging during feature selection).
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     mousedown: function(evt) {
         this.down = evt.xy;
         return this.handle(evt) ? !this.stopDown : true;
     },
-    
+
     /**
      * Method: mouseup
      * Handle mouse up.  Stop propagation if a feature is targeted by this
      *     event.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     mouseup: function(evt) {
         this.up = evt.xy;
@@ -19677,9 +19677,9 @@
      * Method: click
      * Handle click.  Call the "click" callback if click on a feature,
      *     or the "clickout" callback if click outside any feature.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19687,14 +19687,14 @@
     click: function(evt) {
         return this.handle(evt) ? !this.stopClick : true;
     },
-        
+
     /**
      * Method: mousemove
      * Handle mouse moves.  Call the "over" callback if moving in to a feature,
      *     or the "out" callback if moving out of a feature.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19702,17 +19702,17 @@
     mousemove: function(evt) {
         if (!this.callbacks['over'] && !this.callbacks['out']) {
             return true;
-        }     
+        }
         this.handle(evt);
         return true;
     },
-    
+
     /**
      * Method: dblclick
      * Handle dblclick.  Call the "dblclick" callback if dblclick on a feature.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19801,7 +19801,7 @@
         }
         return handled;
     },
-    
+
     /**
      * Method: triggerCallback
      * Call the callback keyed in the event map with the supplied arguments.
@@ -19829,7 +19829,7 @@
     },
 
     /**
-     * Method: activate 
+     * Method: activate
      * Turn on the handler.  Returns false if the handler was already active.
      *
      * Returns:
@@ -19848,12 +19848,12 @@
         }
         return activated;
     },
-    
+
     /**
-     * Method: deactivate 
+     * Method: deactivate
      * Turn off the handler.  Returns false if the handler was already active.
      *
-     * Returns: 
+     * Returns:
      * {Boolean}
      */
     deactivate: function() {
@@ -19873,10 +19873,10 @@
         }
         return deactivated;
     },
-    
+
     /**
      * Method handleMapEvents
-     * 
+     *
      * Parameters:
      * evt - {Object}
      */
@@ -19885,7 +19885,7 @@
             this.moveLayerToTop();
         }
     },
-    
+
     /**
      * Method: moveLayerToTop
      * Moves the layer for this handler to the top, so mouse events can reach
@@ -19895,9 +19895,9 @@
         var index = Math.max(this.map.Z_INDEX_BASE['Feature'] - 1,
             this.layer.getZIndex()) + 1;
         this.layer.setZIndex(index);
-        
+
     },
-    
+
     /**
      * Method: moveLayerBack
      * Moves the layer back to the position determined by the map's layers
@@ -19920,7 +19920,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the clear BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt
  * for the full text of the license. */
 
 /**
@@ -19933,9 +19933,9 @@
  *      on the map that aren't DOM elements. For example one can use
  *      this handler to send WMS/GetFeatureInfo requests as the user
  *      moves the mouve over the map.
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, {
 
@@ -19945,7 +19945,7 @@
      *      the event is considered a hover. Default is 500.
      */
     delay: 500,
-    
+
     /**
      * APIProperty: pixelTolerance
      * {Integer} - Maximum number of pixels between mousemoves for
@@ -19972,7 +19972,7 @@
      * {Number} - The id of the timer.
      */
     timerId: null,
- 
+
     /**
      * Constructor: OpenLayers.Handler.Hover
      * Construct a hover handler.
@@ -20116,18 +20116,18 @@
 /**
  * Class: OpenLayers.Handler.MouseWheel
  * Handler for wheel up/down events.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
-    /** 
-     * Property: wheelListener 
-     * {function} 
+    /**
+     * Property: wheelListener
+     * {function}
      */
     wheelListener: null,
 
-    /** 
+    /**
      * Property: mousePosition
      * {<OpenLayers.Pixel>} mousePosition is necessary because
      * evt.clientX/Y is buggy in Moz on wheel events, so we cache and use the
@@ -20139,12 +20139,12 @@
      * Constructor: OpenLayers.Handler.MouseWheel
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * callbacks - {Object} An object containing a single function to be
      *                          called when the drag operation is finished.
      *                          The callback should expect to recieve a single
      *                          argument, the point geometry.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
@@ -20155,7 +20155,7 @@
 
     /**
      * Method: destroy
-     */    
+     */
     destroy: function() {
         OpenLayers.Handler.prototype.destroy.apply(this, arguments);
         this.wheelListener = null;
@@ -20165,22 +20165,22 @@
      *  Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
      */
 
-    /** 
+    /**
      * Method: onWheelEvent
      * Catch the wheel event and handle it xbrowserly
-     * 
+     *
      * Parameters:
-     * e - {Event} 
+     * e - {Event}
      */
     onWheelEvent: function(e){
-        
+
         // make sure we have a map and check keyboard modifiers
         if (!this.map || !this.checkModifiers(e)) {
             return;
         }
-        
-        // Ride up the element's DOM hierarchy to determine if it or any of 
-        //  its ancestors was: 
+
+        // Ride up the element's DOM hierarchy to determine if it or any of
+        //  its ancestors was:
         //   * specifically marked as scrollable
         //   * one of our layer divs
         //   * the map div
@@ -20188,7 +20188,7 @@
         var overScrollableDiv = false;
         var overLayerDiv = false;
         var overMapDiv = false;
-        
+
         var elem = OpenLayers.Event.element(e);
         while((elem != null) && !overMapDiv && !overScrollableDiv) {
 
@@ -20197,14 +20197,14 @@
                     if (elem.currentStyle) {
                         overflow = elem.currentStyle["overflow"];
                     } else {
-                        var style = 
+                        var style =
                             document.defaultView.getComputedStyle(elem, null);
                         var overflow = style.getPropertyValue("overflow");
                     }
-                    overScrollableDiv = ( overflow && 
+                    overScrollableDiv = ( overflow &&
                         (overflow == "auto") || (overflow == "scroll") );
                 } catch(err) {
-                    //sometimes when scrolling in a popup, this causes 
+                    //sometimes when scrolling in a popup, this causes
                     // obscure browser error
                 }
             }
@@ -20212,10 +20212,10 @@
             if (!overLayerDiv) {
                 for(var i=0, len=this.map.layers.length; i<len; i++) {
                     // Are we in the layer div? Note that we have two cases
-                    // here: one is to catch EventPane layers, which have a 
+                    // here: one is to catch EventPane layers, which have a
                     // pane above the layer (layer.pane)
-                    if (elem == this.map.layers[i].div 
-                        || elem == this.map.layers[i].pane) { 
+                    if (elem == this.map.layers[i].div
+                        || elem == this.map.layers[i].pane) {
                         overLayerDiv = true;
                         break;
                     }
@@ -20225,22 +20225,22 @@
 
             elem = elem.parentNode;
         }
-        
+
         // Logic below is the following:
         //
         // If we are over a scrollable div or not over the map div:
         //  * do nothing (let the browser handle scrolling)
         //
-        //    otherwise 
-        // 
-        //    If we are over the layer div: 
+        //    otherwise
+        //
+        //    If we are over the layer div:
         //     * zoom/in out
         //     then
         //     * kill event (so as not to also scroll the page after zooming)
         //
         //       otherwise
         //
-        //       Kill the event (dont scroll the page if we wheel over the 
+        //       Kill the event (dont scroll the page if we wheel over the
         //        layerswitcher or the pan/zoom control)
         //
         if (!overScrollableDiv && overMapDiv) {
@@ -20255,18 +20255,18 @@
      * Method: wheelZoom
      * Given the wheel event, we carry out the appropriate zooming in or out,
      *     based on the 'wheelDelta' or 'detail' property of the event.
-     * 
+     *
      * Parameters:
      * e - {Event}
      */
     wheelZoom: function(e) {
-        
+
         var delta = 0;
         if (!e) {
             e = window.event;
         }
         if (e.wheelDelta) {
-            delta = e.wheelDelta/120; 
+            delta = e.wheelDelta/120;
             if (window.opera && window.opera.version() < 9.2) {
                 delta = -delta;
             }
@@ -20274,18 +20274,18 @@
             delta = -e.detail / 3;
         }
         if (delta) {
-            // add the mouse position to the event because mozilla has 
-            // a bug with clientX and clientY (see 
+            // add the mouse position to the event because mozilla has
+            // a bug with clientX and clientY (see
             // https://bugzilla.mozilla.org/show_bug.cgi?id=352179)
             // getLonLatFromViewPortPx(e) returns wrong values
             if (this.mousePosition) {
                 e.xy = this.mousePosition;
-            } 
+            }
             if (!e.xy) {
                 // If the mouse hasn't moved over the map yet, then
                 // we don't have a mouse position (in FF), so we just
                 // act as if the mouse was at the center of the map.
-                // Note that we can tell we are in the map -- and 
+                // Note that we can tell we are in the map -- and
                 // this.map is ensured to be true above.
                 e.xy = this.map.getPixelFromLonLat(
                     this.map.getCenter()
@@ -20298,15 +20298,15 @@
             }
         }
     },
-    
+
     /**
      * Method: mousemove
      * Update the stored mousePosition on every move.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
@@ -20314,7 +20314,7 @@
     },
 
     /**
-     * Method: activate 
+     * Method: activate
      */
     activate: function (evt) {
         if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
@@ -20330,7 +20330,7 @@
     },
 
     /**
-     * Method: deactivate 
+     * Method: deactivate
      */
     deactivate: function (evt) {
         if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
@@ -20372,13 +20372,13 @@
      */
     id: null,
 
-    /** 
+    /**
      * APIProperty: name
      * {String}
      */
     name: null,
 
-    /** 
+    /**
      * APIProperty: div
      * {DOMElement}
      */
@@ -20392,20 +20392,20 @@
 
     /**
      * APIProperty: alwaysInRange
-     * {Boolean} If a layer's display should not be scale-based, this should 
-     *     be set to true. This will cause the layer, as an overlay, to always 
-     *     be 'active', by always returning true from the calculateInRange() 
-     *     function. 
-     * 
-     *     If not explicitly specified for a layer, its value will be 
-     *     determined on startup in initResolutions() based on whether or not 
-     *     any scale-specific properties have been set as options on the 
-     *     layer. If no scale-specific options have been set on the layer, we 
+     * {Boolean} If a layer's display should not be scale-based, this should
+     *     be set to true. This will cause the layer, as an overlay, to always
+     *     be 'active', by always returning true from the calculateInRange()
+     *     function.
+     *
+     *     If not explicitly specified for a layer, its value will be
+     *     determined on startup in initResolutions() based on whether or not
+     *     any scale-specific properties have been set as options on the
+     *     layer. If no scale-specific options have been set on the layer, we
      *     assume that it should always be in range.
-     * 
+     *
      *     See #987 for more info.
      */
-    alwaysInRange: null,   
+    alwaysInRange: null,
 
     /**
      * Constant: EVENT_TYPES
@@ -20435,7 +20435,7 @@
      */
     EVENT_TYPES: ["loadstart", "loadend", "loadcancel", "visibilitychanged",
                   "move", "moveend"],
-        
+
     /**
      * APIProperty: events
      * {<OpenLayers.Events>}
@@ -20444,25 +20444,25 @@
 
     /**
      * APIProperty: map
-     * {<OpenLayers.Map>} This variable is set when the layer is added to 
+     * {<OpenLayers.Map>} This variable is set when the layer is added to
      *     the map, via the accessor function setMap().
      */
     map: null,
-    
+
     /**
      * APIProperty: isBaseLayer
-     * {Boolean} Whether or not the layer is a base layer. This should be set 
+     * {Boolean} Whether or not the layer is a base layer. This should be set
      *     individually by all subclasses. Default is false
      */
     isBaseLayer: false,
- 
+
     /**
      * Property: alpha
-     * {Boolean} The layer's images have an alpha channel.  Default is false. 
+     * {Boolean} The layer's images have an alpha channel.  Default is false.
      */
     alpha: false,
 
-    /** 
+    /**
      * APIProperty: displayInLayerSwitcher
      * {Boolean} Display the layer's name in the layer switcher.  Default is
      *     true.
@@ -20477,36 +20477,36 @@
 
     /**
      * APIProperty: attribution
-     * {String} Attribution string, displayed when an 
+     * {String} Attribution string, displayed when an
      *     <OpenLayers.Control.Attribution> has been added to the map.
      */
-    attribution: null, 
+    attribution: null,
 
-    /** 
+    /**
      * Property: inRange
-     * {Boolean} The current map resolution is within the layer's min/max 
-     *     range. This is set in <OpenLayers.Map.setCenter> whenever the zoom 
+     * {Boolean} The current map resolution is within the layer's min/max
+     *     range. This is set in <OpenLayers.Map.setCenter> whenever the zoom
      *     changes.
      */
     inRange: false,
-    
+
     /**
      * Propery: imageSize
-     * {<OpenLayers.Size>} For layers with a gutter, the image is larger than 
+     * {<OpenLayers.Size>} For layers with a gutter, the image is larger than
      *     the tile by twice the gutter in each dimension.
      */
     imageSize: null,
-    
+
     /**
      * Property: imageOffset
-     * {<OpenLayers.Pixel>} For layers with a gutter, the image offset 
+     * {<OpenLayers.Pixel>} For layers with a gutter, the image offset
      *     represents displacement due to the gutter.
      */
     imageOffset: null,
 
   // OPTIONS
 
-    /** 
+    /**
      * Property: options
      * {Object} An optional object whose properties will be set on the layer.
      *     Any of the layer properties can be set as a property of the options
@@ -20532,8 +20532,8 @@
      *     at tile edges to be ignored.  Set a gutter value that is equal to
      *     half the size of the widest symbol that needs to be displayed.
      *     Defaults to zero.  Non-tiled layers always have zero gutter.
-     */ 
-    gutter: 0, 
+     */
+    gutter: 0,
 
     /**
      * APIProperty: projection
@@ -20541,10 +20541,10 @@
      *     override the default projection string this layer - also set maxExtent,
      *     maxResolution, and units if appropriate. Can be either a string or
      *     an <OpenLayers.Projection> object when created -- will be converted
-     *     to an object when setMap is called if a string is passed.  
+     *     to an object when setMap is called if a string is passed.
      */
-    projection: null,    
-    
+    projection: null,
+
     /**
      * APIProperty: units
      * {String} The layer map units.  Defaults to 'degrees'.  Possible values
@@ -20571,7 +20571,7 @@
      *     maxResolution, maxScale, etc.).
      */
     resolutions: null,
-    
+
     /**
      * APIProperty: maxExtent
      * {<OpenLayers.Bounds>}  The center of these bounds will not stray outside
@@ -20580,18 +20580,18 @@
      *     requested that falls completely outside of these bounds.
      */
     maxExtent: null,
-    
+
     /**
      * APIProperty: minExtent
      * {<OpenLayers.Bounds>}
      */
     minExtent: null,
-    
+
     /**
      * APIProperty: maxResolution
      * {Float} Default max is 360 deg / 256 px, which corresponds to
-     *     zoom level 0 on gmaps.  Specify a different value in the layer 
-     *     options if you are not using a geographic projection and 
+     *     zoom level 0 on gmaps.  Specify a different value in the layer
+     *     options if you are not using a geographic projection and
      *     displaying the whole world.
      */
     maxResolution: null,
@@ -20607,13 +20607,13 @@
      * {Integer}
      */
     numZoomLevels: null,
-   
+
     /**
      * APIProperty: minScale
      * {Float}
      */
     minScale: null,
-    
+
     /**
      * APIProperty: maxScale
      * {Float}
@@ -20622,21 +20622,21 @@
 
     /**
      * APIProperty: displayOutsideMaxExtent
-     * {Boolean} Request map tiles that are completely outside of the max 
+     * {Boolean} Request map tiles that are completely outside of the max
      *     extent for this layer. Defaults to false.
      */
     displayOutsideMaxExtent: false,
 
     /**
      * APIProperty: wrapDateLine
-     * {Boolean} #487 for more info.   
+     * {Boolean} #487 for more info.
      */
     wrapDateLine: false,
-    
+
     /**
      * APIProperty: transitionEffect
      * {String} The transition effect to use when the map is panned or
-     *     zoomed.  
+     *     zoomed.
      *
      * There are currently two supported values:
      *  - *null* No transition effect (the default).
@@ -20646,14 +20646,14 @@
      *    resized tiles.
      */
     transitionEffect: null,
-    
+
     /**
      * Property: SUPPORTED_TRANSITIONS
-     * {Array} An immutable (that means don't change it!) list of supported 
+     * {Array} An immutable (that means don't change it!) list of supported
      *     transitionEffect values.
      */
     SUPPORTED_TRANSITIONS: ['resize'],
-    
+
     /**
      * Constructor: OpenLayers.Layer
      *
@@ -20666,7 +20666,7 @@
         this.addOptions(options);
 
         this.name = name;
-        
+
         if (this.id == null) {
 
             this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
@@ -20676,7 +20676,7 @@
             this.div.style.height = "100%";
             this.div.dir = "ltr";
 
-            this.events = new OpenLayers.Events(this, this.div, 
+            this.events = new OpenLayers.Events(this, this.div,
                                                 this.EVENT_TYPES);
             if(this.eventListeners instanceof Object) {
                 this.events.on(this.eventListeners);
@@ -20688,7 +20688,7 @@
             this.displayOutsideMaxExtent = true;
         }
     },
-    
+
     /**
      * Method: destroy
      * Destroy is a destructor: this is to alleviate cyclic references which
@@ -20720,7 +20720,7 @@
         this.eventListeners = null;
         this.events = null;
     },
-    
+
    /**
     * Method: clone
     *
@@ -20731,22 +20731,22 @@
     * {<OpenLayers.Layer>} An exact clone of this <OpenLayers.Layer>
     */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer(this.name, this.options);
-        } 
-        
+        }
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(obj, this);
-        
+
         // a cloned layer should never have its map property set
-        //  because it has not been added to a map yet. 
+        //  because it has not been added to a map yet.
         obj.map = null;
-        
+
         return obj;
     },
-    
-    /** 
+
+    /**
      * APIMethod: setName
      * Sets the new layer name for this layer.  Can trigger a changelayer event
      *     on the map.
@@ -20764,33 +20764,33 @@
                 });
             }
         }
-    },    
-    
+    },
+
    /**
     * APIMethod: addOptions
-    * 
+    *
     * Parameters:
     * newOptions - {Object}
     */
     addOptions: function (newOptions) {
-        
+
         if (this.options == null) {
             this.options = {};
         }
-        
+
         // update our copy for clone
         OpenLayers.Util.extend(this.options, newOptions);
 
         // add new options to this
         OpenLayers.Util.extend(this, newOptions);
     },
-    
+
     /**
      * APIMethod: onMapResize
      * This function can be implemented by subclasses
      */
     onMapResize: function() {
-        //this function can be implemented by subclasses  
+        //this function can be implemented by subclasses
     },
 
     /**
@@ -20823,7 +20823,7 @@
 
     /**
      * Method: moveTo
-     * 
+     *
      * Parameters:
      * bound - {<OpenLayers.Bounds>}
      * zoomChanged - {Boolean} Tells when zoom has changed, as layers have to
@@ -20841,47 +20841,47 @@
     /**
      * Method: setMap
      * Set the map property for the layer. This is done through an accessor
-     *     so that subclasses can override this and take special action once 
-     *     they have their map variable set. 
-     * 
-     *     Here we take care to bring over any of the necessary default 
-     *     properties from the map. 
-     * 
+     *     so that subclasses can override this and take special action once
+     *     they have their map variable set.
+     *
+     *     Here we take care to bring over any of the necessary default
+     *     properties from the map.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         if (this.map == null) {
-        
+
             this.map = map;
-            
+
             // grab some essential layer data from the map if it hasn't already
             //  been set
             this.maxExtent = this.maxExtent || this.map.maxExtent;
             this.projection = this.projection || this.map.projection;
-            
+
             if (this.projection && typeof this.projection == "string") {
                 this.projection = new OpenLayers.Projection(this.projection);
             }
-            
+
             // Check the projection to see if we can get units -- if not, refer
             // to properties.
             this.units = this.projection.getUnits() ||
                          this.units || this.map.units;
-            
+
             this.initResolutions();
-            
+
             if (!this.isBaseLayer) {
                 this.inRange = this.calculateInRange();
                 var show = ((this.visibility) && (this.inRange));
                 this.div.style.display = show ? "" : "none";
             }
-            
+
             // deal with gutters
             this.setTileSize();
         }
     },
-    
+
     /**
      * Method: afterAdd
      * Called at the end of the map.addLayer sequence.  At this point, the map
@@ -20889,39 +20889,39 @@
      */
     afterAdd: function() {
     },
-    
+
     /**
      * APIMethod: removeMap
-     * Just as setMap() allows each layer the possibility to take a 
+     * Just as setMap() allows each layer the possibility to take a
      *     personalized action on being added to the map, removeMap() allows
-     *     each layer to take a personalized action on being removed from it. 
+     *     each layer to take a personalized action on being removed from it.
      *     For now, this will be mostly unused, except for the EventPane layer,
      *     which needs this hook so that it can remove the special invisible
-     *     pane. 
-     * 
+     *     pane.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     removeMap: function(map) {
         //to be overridden by subclasses
     },
-    
+
     /**
      * APIMethod: getImageSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} The size that the image should be, taking into 
+     * {<OpenLayers.Size>} The size that the image should be, taking into
      *     account gutters.
-     */ 
-    getImageSize: function() { 
-        return (this.imageSize || this.tileSize); 
-    },    
-  
+     */
+    getImageSize: function() {
+        return (this.imageSize || this.tileSize);
+    },
+
     /**
      * APIMethod: setTileSize
      * Set the tile size based on the map size.  This also sets layer.imageSize
      *     and layer.imageOffset for use by Tile.Image.
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>}
      */
@@ -20937,16 +20937,16 @@
           //                              this.name + ": layers with " +
           //                              "gutters need non-null tile sizes");
           //}
-            this.imageOffset = new OpenLayers.Pixel(-this.gutter, 
-                                                    -this.gutter); 
-            this.imageSize = new OpenLayers.Size(tileSize.w + (2*this.gutter), 
-                                                 tileSize.h + (2*this.gutter)); 
+            this.imageOffset = new OpenLayers.Pixel(-this.gutter,
+                                                    -this.gutter);
+            this.imageSize = new OpenLayers.Size(tileSize.w + (2*this.gutter),
+                                                 tileSize.h + (2*this.gutter));
         }
     },
 
     /**
      * APIMethod: getVisibility
-     * 
+     *
      * Returns:
      * {Boolean} The layer should be displayed (if in range).
      */
@@ -20954,18 +20954,18 @@
         return this.visibility;
     },
 
-    /** 
+    /**
      * APIMethod: setVisibility
-     * Set the visibility flag for the layer and hide/show & redraw 
+     * Set the visibility flag for the layer and hide/show & redraw
      *     accordingly. Fire event unless otherwise specified
-     * 
+     *
      * Note that visibility is no longer simply whether or not the layer's
-     *     style.display is set to "block". Now we store a 'visibility' state 
-     *     property on the layer class, this allows us to remember whether or 
-     *     not we *desire* for a layer to be visible. In the case where the 
-     *     map's resolution is out of the layer's range, this desire may be 
+     *     style.display is set to "block". Now we store a 'visibility' state
+     *     property on the layer class, this allows us to remember whether or
+     *     not we *desire* for a layer to be visible. In the case where the
+     *     map's resolution is out of the layer's range, this desire may be
      *     subverted.
-     * 
+     *
      * Parameters:
      * visible - {Boolean} Whether or not to display the layer (if in range)
      */
@@ -20984,10 +20984,10 @@
         }
     },
 
-    /** 
+    /**
      * APIMethod: display
      * Hide or show the Layer
-     * 
+     *
      * Parameters:
      * display - {Boolean}
      */
@@ -21000,10 +21000,10 @@
 
     /**
      * APIMethod: calculateInRange
-     * 
+     *
      * Returns:
      * {Boolean} The layer is displayable at the current map's current
-     *     resolution. Note that if 'alwaysInRange' is true for the layer, 
+     *     resolution. Note that if 'alwaysInRange' is true for the layer,
      *     this function will always return true.
      */
     calculateInRange: function() {
@@ -21021,9 +21021,9 @@
         return inRange;
     },
 
-    /** 
+    /**
      * APIMethod: setIsBaseLayer
-     * 
+     *
      * Parameters:
      * isBaseLayer - {Boolean}
      */
@@ -21043,73 +21043,73 @@
   /*                 Baselayer Functions                  */
   /*                                                      */
   /********************************************************/
-  
-    /** 
+
+    /**
      * Method: initResolutions
-     * This method's responsibility is to set up the 'resolutions' array 
+     * This method's responsibility is to set up the 'resolutions' array
      *     for the layer -- this array is what the layer will use to interface
-     *     between the zoom levels of the map and the resolution display 
+     *     between the zoom levels of the map and the resolution display
      *     of the layer.
-     * 
+     *
      * The user has several options that determine how the array is set up.
-     *  
-     * For a detailed explanation, see the following wiki from the 
+     *
+     * For a detailed explanation, see the following wiki from the
      *     openlayers.org homepage:
      *     http://trac.openlayers.org/wiki/SettingZoomLevels
      */
     initResolutions: function() {
 
-        // These are the relevant options which are used for calculating 
+        // These are the relevant options which are used for calculating
         //  resolutions information.
         //
         var props = new Array(
           'projection', 'units',
           'scales', 'resolutions',
-          'maxScale', 'minScale', 
-          'maxResolution', 'minResolution', 
+          'maxScale', 'minScale',
+          'maxResolution', 'minResolution',
           'minExtent', 'maxExtent',
           'numZoomLevels', 'maxZoomLevel'
         );
 
-        //these are the properties which do *not* imply that user wishes 
+        //these are the properties which do *not* imply that user wishes
         // this layer to be scale-dependant
-        var notScaleProps = ['projection', 'units'];    
+        var notScaleProps = ['projection', 'units'];
 
-        //should the layer be scale-dependant? default is false -- this will 
+        //should the layer be scale-dependant? default is false -- this will
         // only be set true if we find that the user has specified a property
         // from the 'props' array that is not in 'notScaleProps'
         var useInRange = false;
 
-        // First we create a new object where we will store all of the 
+        // First we create a new object where we will store all of the
         //  resolution-related properties that we find in either the layer's
         //  'options' array or from the map.
         //
-        var confProps = {};        
+        var confProps = {};
         for(var i=0, len=props.length; i<len; i++) {
             var property = props[i];
-            
-            // If the layer had one of these properties set *and* it is 
+
+            // If the layer had one of these properties set *and* it is
             // a scale property (is not a non-scale property), then we assume
             // the user did intend to use scale-dependant display (useInRange).
-            if (this.options[property] && 
+            if (this.options[property] &&
                 OpenLayers.Util.indexOf(notScaleProps, property) == -1) {
                 useInRange = true;
             }
-                   
+
             confProps[property] = this.options[property] || this.map[property];
         }
 
-        //only automatically set 'alwaysInRange' if the user hasn't already 
+        //only automatically set 'alwaysInRange' if the user hasn't already
         // set it (to true or false, since the default is null). If user did
         // not intend to use scale-dependant display then we set they layer
-        // as alwaysInRange. This means calculateInRange() will always return 
+        // as alwaysInRange. This means calculateInRange() will always return
         // true and the layer will never be turned off due to scale changes.
         //
         if (this.alwaysInRange == null) {
             this.alwaysInRange = !useInRange;
         }
 
-        // Do not use the scales array set at the map level if 
+        // Do not use the scales array set at the map level if
         // either minScale or maxScale or both are set at the
         // layer level
         if ((this.options.minScale != null ||
@@ -21118,7 +21118,7 @@
 
             confProps.scales = null;
         }
-        // Do not use the resolutions array set at the map level if 
+        // Do not use the resolutions array set at the map level if
         // either minResolution or maxResolution or both are set at the
         // layer level
         if ((this.options.minResolution != null ||
@@ -21128,14 +21128,14 @@
             confProps.resolutions = null;
         }
 
-        // If numZoomLevels hasn't been set and the maxZoomLevel *has*, 
+        // If numZoomLevels hasn't been set and the maxZoomLevel *has*,
         //  then use maxZoomLevel to calculate numZoomLevels
         //
         if ( (!confProps.numZoomLevels) && (confProps.maxZoomLevel) ) {
             confProps.numZoomLevels = confProps.maxZoomLevel + 1;
         }
 
-        // First off, we take whatever hodge-podge of values we have and 
+        // First off, we take whatever hodge-podge of values we have and
         //  calculate/distill them down into a resolutions[] array
         //
         if ((confProps.scales != null) || (confProps.resolutions != null)) {
@@ -21144,8 +21144,8 @@
                 confProps.resolutions = [];
                 for(var i=0, len=confProps.scales.length; i<len; i++) {
                     var scale = confProps.scales[i];
-                    confProps.resolutions[i] = 
-                       OpenLayers.Util.getResolutionFromScale(scale, 
+                    confProps.resolutions[i] =
+                       OpenLayers.Util.getResolutionFromScale(scale,
                                                               confProps.units);
                 }
             }
@@ -21156,39 +21156,39 @@
 
             // determine maxResolution
             if (confProps.minScale) {
-                confProps.maxResolution = 
-                    OpenLayers.Util.getResolutionFromScale(confProps.minScale, 
+                confProps.maxResolution =
+                    OpenLayers.Util.getResolutionFromScale(confProps.minScale,
                                                            confProps.units);
             } else if (confProps.maxResolution == "auto") {
                 var viewSize = this.map.getSize();
                 var wRes = confProps.maxExtent.getWidth() / viewSize.w;
                 var hRes = confProps.maxExtent.getHeight()/ viewSize.h;
                 confProps.maxResolution = Math.max(wRes, hRes);
-            } 
+            }
 
             // determine minResolution
-            if (confProps.maxScale != null) {           
-                confProps.minResolution = 
-                    OpenLayers.Util.getResolutionFromScale(confProps.maxScale, 
+            if (confProps.maxScale != null) {
+                confProps.minResolution =
+                    OpenLayers.Util.getResolutionFromScale(confProps.maxScale,
                                                            confProps.units);
-            } else if ( (confProps.minResolution == "auto") && 
+            } else if ( (confProps.minResolution == "auto") &&
                         (confProps.minExtent != null) ) {
                 var viewSize = this.map.getSize();
                 var wRes = confProps.minExtent.getWidth() / viewSize.w;
                 var hRes = confProps.minExtent.getHeight()/ viewSize.h;
                 confProps.minResolution = Math.max(wRes, hRes);
-            } 
+            }
 
             // determine numZoomLevels if not already set on the layer
             // this gives numZoomLevels assuming approximately base 2 scaling
             if (confProps.minResolution != null &&
                 this.options.numZoomLevels == undefined) {
                 var ratio = confProps.maxResolution / confProps.minResolution;
-                confProps.numZoomLevels = 
+                confProps.numZoomLevels =
                     Math.floor(Math.log(ratio) / Math.log(2)) + 1;
             }
-            
-            // now we have numZoomLevels and maxResolution, 
+
+            // now we have numZoomLevels and maxResolution,
             //  we can populate the resolutions array
             confProps.resolutions = new Array(confProps.numZoomLevels);
             var base = 2;
@@ -21210,15 +21210,15 @@
                 confProps.resolutions[i] = res;
             }
         }
-        
+
         //sort resolutions array ascendingly
         //
         confProps.resolutions.sort( function(a, b) { return(b-a); } );
 
-        // now set our newly calculated values back to the layer 
-        //  Note: We specifically do *not* set them to layer.options, which we 
-        //        will preserve as it was when we added this layer to the map. 
-        //        this way cloned layers reset themselves to new map div 
+        // now set our newly calculated values back to the layer
+        //  Note: We specifically do *not* set them to layer.options, which we
+        //        will preserve as it was when we added this layer to the map.
+        //        this way cloned layers reset themselves to new map div
         //        dimensions)
         //
 
@@ -21226,22 +21226,22 @@
         this.maxResolution = confProps.resolutions[0];
         var lastIndex = confProps.resolutions.length - 1;
         this.minResolution = confProps.resolutions[lastIndex];
-        
+
         this.scales = [];
         for(var i=0, len=confProps.resolutions.length; i<len; i++) {
-            this.scales[i] = 
-               OpenLayers.Util.getScaleFromResolution(confProps.resolutions[i], 
+            this.scales[i] =
+               OpenLayers.Util.getScaleFromResolution(confProps.resolutions[i],
                                                       confProps.units);
         }
         this.minScale = this.scales[0];
         this.maxScale = this.scales[this.scales.length - 1];
-        
+
         this.numZoomLevels = confProps.numZoomLevels;
     },
 
     /**
      * APIMethod: getResolution
-     * 
+     *
      * Returns:
      * {Float} The currently selected resolution of the map, taken from the
      *     resolutions array, indexed by current zoom level.
@@ -21251,11 +21251,11 @@
         return this.getResolutionForZoom(zoom);
     },
 
-    /** 
+    /**
      * APIMethod: getExtent
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
      *     bounds of the current viewPort.
      */
     getExtent: function() {
@@ -21267,18 +21267,18 @@
 
     /**
      * APIMethod: getZoomForExtent
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
      *
      * Returns:
-     * {Integer} The index of the zoomLevel (entry in the resolutions array) 
-     *     for the passed-in extent. We do this by calculating the ideal 
-     *     resolution for the given extent (based on the map size) and then 
+     * {Integer} The index of the zoomLevel (entry in the resolutions array)
+     *     for the passed-in extent. We do this by calculating the ideal
+     *     resolution for the given extent (based on the map size) and then
      *     calling getZoomForResolution(), passing along the 'closest'
      *     parameter.
      */
@@ -21289,12 +21289,12 @@
 
         return this.getZoomForResolution(idealResolution, closest);
     },
-    
-    /** 
+
+    /**
      * Method: getDataExtent
      * Calculates the max extent which includes all of the data for the layer.
      *     This function is to be implemented by subclasses.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -21304,10 +21304,10 @@
 
     /**
      * APIMethod: getResolutionForZoom
-     * 
+     *
      * Parameter:
      * zoom - {Float}
-     * 
+     *
      * Returns:
      * {Float} A suitable resolution for the specified zoom.
      */
@@ -21327,20 +21327,20 @@
 
     /**
      * APIMethod: getZoomForResolution
-     * 
+     *
      * Parameters:
      * resolution - {Float}
-     * closest - {Boolean} Find the zoom level that corresponds to the absolute 
+     * closest - {Boolean} Find the zoom level that corresponds to the absolute
      *     closest resolution, which may result in a zoom whose corresponding
      *     resolution is actually smaller than we would have desired (if this
      *     is being called from a getZoomForExtent() call, then this means that
-     *     the returned zoom index might not actually contain the entire 
+     *     the returned zoom index might not actually contain the entire
      *     extent specified... but it'll be close).
      *     Default is false.
-     * 
+     *
      * Returns:
-     * {Integer} The index of the zoomLevel (entry in the resolutions array) 
-     *     that corresponds to the best fit resolution given the passed in 
+     * {Integer} The index of the zoomLevel (entry in the resolutions array)
+     *     that corresponds to the best fit resolution given the passed in
      *     value and the 'closest' specification.
      */
     getZoomForResolution: function(resolution, closest) {
@@ -21372,7 +21372,7 @@
         } else {
             var diff;
             var minDiff = Number.POSITIVE_INFINITY;
-            for(var i=0, len=this.resolutions.length; i<len; i++) {            
+            for(var i=0, len=this.resolutions.length; i<len; i++) {
                 if (closest) {
                     diff = Math.abs(this.resolutions[i] - resolution);
                     if (diff > minDiff) {
@@ -21389,15 +21389,15 @@
         }
         return zoom;
     },
-    
+
     /**
      * APIMethod: getLonLatFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
      *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in
      *     view port <OpenLayers.Pixel>, translated into lon/lat by the layer.
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
@@ -21407,12 +21407,12 @@
             var center = this.map.getCenter();
             if (center) {
                 var res  = this.map.getResolution();
-        
+
                 var delta_x = viewPortPx.x - (size.w / 2);
                 var delta_y = viewPortPx.y - (size.h / 2);
-            
+
                 lonlat = new OpenLayers.LonLat(center.lon + delta_x * res ,
-                                             center.lat - delta_y * res); 
+                                             center.lat - delta_y * res);
 
                 if (this.wrapDateLine) {
                     lonlat = lonlat.wrapDateLine(this.maxExtent);
@@ -21426,31 +21426,31 @@
      * APIMethod: getViewPortPxFromLonLat
      * Returns a pixel location given a map location.  This method will return
      *     fractional pixel values.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
      *
-     * Returns: 
-     * {<OpenLayers.Pixel>} An <OpenLayers.Pixel> which is the passed-in 
+     * Returns:
+     * {<OpenLayers.Pixel>} An <OpenLayers.Pixel> which is the passed-in
      *     <OpenLayers.LonLat>,translated into view port pixels.
      */
     getViewPortPxFromLonLat: function (lonlat) {
-        var px = null; 
+        var px = null;
         if (lonlat != null) {
             var resolution = this.map.getResolution();
             var extent = this.map.getExtent();
             px = new OpenLayers.Pixel(
                 (1/resolution * (lonlat.lon - extent.left)),
                 (1/resolution * (extent.top - lonlat.lat))
-            );    
+            );
         }
         return px;
     },
-    
+
     /**
      * APIMethod: setOpacity
      * Sets the opacity for the entire layer (all images)
-     * 
+     *
      * Parameter:
      * opacity - {Float}
      */
@@ -21459,7 +21459,7 @@
             this.opacity = opacity;
             for(var i=0, len=this.div.childNodes.length; i<len; ++i) {
                 var element = this.div.childNodes[i].firstChild;
-                OpenLayers.Util.modifyDOMElement(element, null, null, null, 
+                OpenLayers.Util.modifyDOMElement(element, null, null, null,
                                                  null, null, null, opacity);
             }
         }
@@ -21467,20 +21467,20 @@
 
     /**
      * Method: getZIndex
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Integer} the z-index of this layer
-     */    
+     */
     getZIndex: function () {
         return this.div.style.zIndex;
     },
 
     /**
      * Method: setZIndex
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * zIndex - {Integer}
-     */    
+     */
     setZIndex: function (zIndex) {
         this.div.style.zIndex = zIndex;
     },
@@ -21488,18 +21488,18 @@
     /**
      * Method: adjustBounds
      * This function will take a bounds, and if wrapDateLine option is set
-     *     on the layer, it will return a bounds which is wrapped around the 
-     *     world. We do not wrap for bounds which *cross* the 
-     *     maxExtent.left/right, only bounds which are entirely to the left 
+     *     on the layer, it will return a bounds which is wrapped around the
+     *     world. We do not wrap for bounds which *cross* the
+     *     maxExtent.left/right, only bounds which are entirely to the left
      *     or entirely to the right.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     adjustBounds: function (bounds) {
 
         if (this.gutter) {
-            // Adjust the extent of a bounds in map units by the 
+            // Adjust the extent of a bounds in map units by the
             // layer's gutter in pixels.
             var mapGutter = this.gutter * this.map.getResolution();
             bounds = new OpenLayers.Bounds(bounds.left - mapGutter,
@@ -21510,11 +21510,11 @@
 
         if (this.wrapDateLine) {
             // wrap around the date line, within the limits of rounding error
-            var wrappingOptions = { 
+            var wrappingOptions = {
                 'rightTolerance':this.getResolution()
-            };    
+            };
             bounds = bounds.wrapDateLine(this.maxExtent, wrappingOptions);
-                              
+
         }
         return bounds;
     },
@@ -21538,29 +21538,29 @@
  * Class: OpenLayers.Marker.Box
  *
  * Inherits from:
- *  - <OpenLayers.Marker> 
+ *  - <OpenLayers.Marker>
  */
 OpenLayers.Marker.Box = OpenLayers.Class(OpenLayers.Marker, {
 
-    /** 
-     * Property: bounds 
-     * {<OpenLayers.Bounds>} 
+    /**
+     * Property: bounds
+     * {<OpenLayers.Bounds>}
      */
     bounds: null,
 
-    /** 
-     * Property: div 
-     * {DOMElement} 
+    /**
+     * Property: div
+     * {DOMElement}
      */
     div: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Marker.Box
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * borderColor - {String} 
-     * borderWidth - {int} 
+     * bounds - {<OpenLayers.Bounds>}
+     * borderColor - {String}
+     * borderWidth - {int}
      */
     initialize: function(bounds, borderColor, borderWidth) {
         this.bounds = bounds;
@@ -21571,8 +21571,8 @@
     },
 
     /**
-     * Method: destroy 
-     */    
+     * Method: destroy
+     */
     destroy: function() {
 
         this.bounds = null;
@@ -21581,10 +21581,10 @@
         OpenLayers.Marker.prototype.destroy.apply(this, arguments);
     },
 
-    /** 
+    /**
      * Method: setBorder
      * Allow the user to change the box's color and border width
-     * 
+     *
      * Parameters:
      * color - {String} Default is "red"
      * width - {int} Default is 2
@@ -21598,26 +21598,26 @@
         }
         this.div.style.border = width + "px solid " + color;
     },
-    
-    /** 
+
+    /**
     * Method: draw
-    * 
+    *
     * Parameters:
-    * px - {<OpenLayers.Pixel>} 
-    * sz - {<OpenLayers.Size>} 
-    * 
-    * Returns: 
-    * {DOMElement} A new DOM Image with this marker´s icon set at the 
+    * px - {<OpenLayers.Pixel>}
+    * sz - {<OpenLayers.Size>}
+    *
+    * Returns:
+    * {DOMElement} A new DOM Image with this marker´s icon set at the
     *         location passed-in
     */
     draw: function(px, sz) {
         OpenLayers.Util.modifyDOMElement(this.div, null, px, sz);
         return this.div;
-    }, 
+    },
 
     /**
      * Method: onScreen
-     * 
+     *
      * Rreturn:
      * {Boolean} Whether or not the marker is currently visible on screen.
      */
@@ -21626,16 +21626,16 @@
         if (this.map) {
             var screenBounds = this.map.getExtent();
             onScreen = screenBounds.containsBounds(this.bounds, true, true);
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: display
      * Hide or show the icon
-     * 
+     *
      * Parameters:
-     * display - {Boolean} 
+     * display - {Boolean}
      */
     display: function(display) {
         this.div.style.display = (display) ? "" : "none";
@@ -21983,19 +21983,19 @@
  *  @uri url to do remote XML http get
  *  @param {String} 'get' format params (x=y&a=b...)
  *  @who object to handle callbacks for this request
- *  @complete  the function to be called on success 
+ *  @complete  the function to be called on success
  *  @failure  the function to be called on failure
- *  
+ *
  *   example usage from a caller:
- *  
+ *
  *     caps: function(request) {
- *      -blah-  
+ *      -blah-
  *     },
- *  
+ *
  *     OpenLayers.loadURL(url,params,this,caps);
  *
  * Notice the above example does not provide an error handler; a default empty
- * handler is provided which merely logs the error if a failure handler is not 
+ * handler is provided which merely logs the error if a failure handler is not
  * supplied
  *
  */
@@ -22009,7 +22009,7 @@
     OpenLayers.Console.userError(OpenLayers.i18n("unhandledRequest", {'statusText':request.statusText}));
 };
 
-/** 
+/**
  * APIFunction: loadURL
  * Background load a document.  For more flexibility in using XMLHttpRequest,
  *     see the <OpenLayers.Request> methods.
@@ -22023,7 +22023,7 @@
  * onComplete - {Function} Optional callback for success.  The callback
  *     will be called with this set to caller and will receive the request
  *     object as an argument.  Note that if you do not specify an onComplete
- *     function, <OpenLayers.nullHandler> will be called (which pops up a 
+ *     function, <OpenLayers.nullHandler> will be called (which pops up a
  *     user friendly error message dialog).
  * onFailure - {Function} Optional callback for failure.  In the event of
  *     a failure, the callback will be called with this set to caller and will
@@ -22037,26 +22037,26 @@
  */
 OpenLayers.loadURL = function(uri, params, caller,
                                   onComplete, onFailure) {
-    
+
     if(typeof params == 'string') {
         params = OpenLayers.Util.getParameters(params);
     }
     var success = (onComplete) ? onComplete : OpenLayers.nullHandler;
     var failure = (onFailure) ? onFailure : OpenLayers.nullHandler;
-    
+
     return OpenLayers.Request.GET({
         url: uri, params: params,
         success: success, failure: failure, scope: caller
     });
 };
 
-/** 
+/**
  * Function: parseXMLString
  * Parse XML into a doc structure
- * 
+ *
  * Parameters:
- * text - {String} 
- * 
+ * text - {String}
+ *
  * Returns:
  * {?} Parsed AJAX Responsev
  */
@@ -22105,8 +22105,8 @@
 
     /**
      * Method: getTransport
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} Transport mechanism for whichever browser we're in, or false if
      *          none available.
      */
@@ -22130,7 +22130,7 @@
  * {Object}
  */
 OpenLayers.Ajax.Responders = {
-  
+
     /**
      * Property: responders
      * {Array}
@@ -22139,7 +22139,7 @@
 
     /**
      * Method: register
-     *  
+     *
      * Parameters:
      * responderToAdd - {?}
      */
@@ -22154,7 +22154,7 @@
 
     /**
      * Method: unregister
-     *  
+     *
      * Parameters:
      * responderToRemove - {?}
      */
@@ -22164,7 +22164,7 @@
 
     /**
      * Method: dispatch
-     * 
+     *
      * Parameters:
      * callback - {?}
      * request - {?}
@@ -22174,11 +22174,11 @@
         var responder;
         for (var i = 0; i < this.responders.length; i++) {
             responder = this.responders[i];
-     
-            if (responder[callback] && 
+
+            if (responder[callback] &&
                 typeof responder[callback] == 'function') {
                 try {
-                    responder[callback].apply(responder, 
+                    responder[callback].apply(responder,
                                               [request, transport]);
                 } catch (e) {}
             }
@@ -22187,7 +22187,7 @@
 };
 
 OpenLayers.Ajax.Responders.register({
-    /** 
+    /**
      * Function: onCreate
      */
     onCreate: function() {
@@ -22206,11 +22206,11 @@
  * Class: OpenLayers.Ajax.Base
  */
 OpenLayers.Ajax.Base = OpenLayers.Class({
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Base
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * options - {Object}
      */
     initialize: function(options) {
@@ -22221,11 +22221,11 @@
             parameters:   ''
         };
         OpenLayers.Util.extend(this.options, options || {});
-        
+
         this.options.method = this.options.method.toLowerCase();
-        
+
         if (typeof this.options.parameters == 'string') {
-            this.options.parameters = 
+            this.options.parameters =
                 OpenLayers.Util.getParameters(this.options.parameters);
         }
     }
@@ -22246,28 +22246,28 @@
      * {Boolean}
      */
     _complete: false,
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Request
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * url - {String}
      * options - {Object}
      */
     initialize: function(url, options) {
         OpenLayers.Ajax.Base.prototype.initialize.apply(this, [options]);
-        
+
         if (OpenLayers.ProxyHost && OpenLayers.String.startsWith(url, "http")) {
             url = OpenLayers.ProxyHost + encodeURIComponent(url);
         }
-        
+
         this.transport = OpenLayers.Ajax.getTransport();
         this.request(url);
     },
 
     /**
      * Method: request
-     * 
+     *
      * Parameters:
      * url - {String}
      */
@@ -22275,15 +22275,15 @@
         this.url = url;
         this.method = this.options.method;
         var params = OpenLayers.Util.extend({}, this.options.parameters);
-        
+
         if (this.method != 'get' && this.method != 'post') {
             // simulate other verbs over post
             params['_method'] = this.method;
             this.method = 'post';
         }
 
-        this.parameters = params;        
-        
+        this.parameters = params;
+
         if (params = OpenLayers.Util.getParameterString(params)) {
             // when GET, append parameters to URL
             if (this.method == 'get') {
@@ -22297,31 +22297,31 @@
             if (this.options.onCreate) {
                 this.options.onCreate(response);
             }
-            
-            OpenLayers.Ajax.Responders.dispatch('onCreate', 
-                                                this, 
+
+            OpenLayers.Ajax.Responders.dispatch('onCreate',
+                                                this,
                                                 response);
-    
-            this.transport.open(this.method.toUpperCase(), 
+
+            this.transport.open(this.method.toUpperCase(),
                                 this.url,
                                 this.options.asynchronous);
-    
+
             if (this.options.asynchronous) {
                 window.setTimeout(
                     OpenLayers.Function.bind(this.respondToReadyState, this, 1),
                     10);
             }
-            
-            this.transport.onreadystatechange = 
-                OpenLayers.Function.bind(this.onStateChange, this);    
+
+            this.transport.onreadystatechange =
+                OpenLayers.Function.bind(this.onStateChange, this);
             this.setRequestHeaders();
-    
+
             this.body =  this.method == 'post' ?
                 (this.options.postBody || params) : null;
             this.transport.send(this.body);
-    
+
             // Force Firefox to handle ready state 4 for synchronous requests
-            if (!this.options.asynchronous && 
+            if (!this.options.asynchronous &&
                 this.transport.overrideMimeType) {
                 this.onStateChange();
             }
@@ -22339,7 +22339,7 @@
             this.respondToReadyState(this.transport.readyState);
         }
     },
-     
+
     /**
      * Method: setRequestHeaders
      */
@@ -22353,7 +22353,7 @@
         if (this.method == 'post') {
             headers['Content-type'] = this.options.contentType +
                 (this.options.encoding ? '; charset=' + this.options.encoding : '');
-    
+
             /* Force "Connection: close" for older Mozilla browsers to work
              * around a bug where XMLHttpRequest sends an incorrect
              * Content-length header. See Mozilla Bugzilla #246651.
@@ -22364,9 +22364,9 @@
             }
         }
         // user-defined headers
-        if (typeof this.options.requestHeaders == 'object') {    
+        if (typeof this.options.requestHeaders == 'object') {
             var extras = this.options.requestHeaders;
-            
+
             if (typeof extras.push == 'function') {
                 for (var i = 0, length = extras.length; i < length; i += 2) {
                     headers[extras[i]] = extras[i+1];
@@ -22377,23 +22377,23 @@
                 }
             }
         }
-        
+
         for (var name in headers) {
             this.transport.setRequestHeader(name, headers[name]);
         }
     },
-    
+
     /**
      * Method: success
      *
      * Returns:
-     * {Boolean} - 
+     * {Boolean} -
      */
     success: function() {
         var status = this.getStatus();
         return !status || (status >=200 && status < 300);
     },
-    
+
     /**
      * Method: getStatus
      *
@@ -22417,7 +22417,7 @@
     respondToReadyState: function(readyState) {
         var state = OpenLayers.Ajax.Request.Events[readyState];
         var response = new OpenLayers.Ajax.Response(this);
-    
+
         if (state == 'Complete') {
             try {
                 this._complete = true;
@@ -22427,29 +22427,29 @@
             } catch (e) {
                 this.dispatchException(e);
             }
-    
+
             var contentType = response.getHeader('Content-type');
         }
-    
+
         try {
-            (this.options['on' + state] || 
+            (this.options['on' + state] ||
              OpenLayers.Ajax.emptyFunction)(response);
-             OpenLayers.Ajax.Responders.dispatch('on' + state, 
-                                                 this, 
+             OpenLayers.Ajax.Responders.dispatch('on' + state,
+                                                 this,
                                                  response);
         } catch (e) {
             this.dispatchException(e);
         }
-    
+
         if (state == 'Complete') {
             // avoid memory leak in MSIE: clean up
             this.transport.onreadystatechange = OpenLayers.Ajax.emptyFunction;
         }
     },
-    
+
     /**
      * Method: getHeader
-     * 
+     *
      * Parameters:
      * name - {String} Header name
      *
@@ -22469,7 +22469,7 @@
      * If the optional onException function is set, execute it
      * and then dispatch the call to any other listener registered
      * for onException.
-     * 
+     *
      * If no optional onException function is set, we suspect that
      * the user may have also not used
      * OpenLayers.Ajax.Responders.register to register a listener
@@ -22481,7 +22481,7 @@
      * request.options.onException to an empty function (function(){})
      * or register an empty function with <OpenLayers.Ajax.Responders>
      * for onException.
-     * 
+     *
      * Parameters:
      * exception - {?}
      */
@@ -22512,7 +22512,7 @@
     }
 });
 
-/** 
+/**
  * Property: Events
  * {Array(String)}
  */
@@ -22530,26 +22530,26 @@
      * {Integer}
      */
     status: 0,
-    
 
+
     /**
      * Property: statusText
      *
      * {String}
      */
     statusText: '',
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Response
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * request - {Object}
      */
     initialize: function(request) {
         this.request = request;
         var transport = this.transport = request.transport,
             readyState = this.readyState = transport.readyState;
-        
+
         if ((readyState > 2 &&
             !(!!(window.attachEvent && !window.opera))) ||
             readyState == 4) {
@@ -22558,18 +22558,18 @@
             this.responseText = transport.responseText == null ?
                 '' : String(transport.responseText);
         }
-        
+
         if(readyState == 4) {
             var xml = transport.responseXML;
             this.responseXML  = xml === undefined ? null : xml;
         }
     },
-    
+
     /**
      * Method: getStatus
      */
     getStatus: OpenLayers.Ajax.Request.prototype.getStatus,
-    
+
     /**
      * Method: getStatustext
      *
@@ -22583,13 +22583,13 @@
             return '';
         }
     },
-    
+
     /**
      * Method: getHeader
      */
     getHeader: OpenLayers.Ajax.Request.prototype.getHeader,
-    
-    /** 
+
+    /**
      * Method: getResponseHeader
      *
      * Returns:
@@ -22603,17 +22603,17 @@
 
 /**
  * Function: getElementsByTagNameNS
- * 
+ *
  * Parameters:
  * parentnode - {?}
  * nsuri - {?}
  * nsprefix - {?}
  * tagname - {?}
- * 
+ *
  * Returns:
  * {?}
  */
-OpenLayers.Ajax.getElementsByTagNameNS  = function(parentnode, nsuri, 
+OpenLayers.Ajax.getElementsByTagNameNS  = function(parentnode, nsuri,
                                                    nsprefix, tagname) {
     var elem = null;
     if (parentnode.getElementsByTagNameNS) {
@@ -22631,9 +22631,9 @@
  *     IE/Safari. We need to come up with a way to serialize in those browser:
  *     for now, these browsers will just fail. #535, #536
  *
- * Parameters: 
+ * Parameters:
  * xmldom {XMLNode} xml dom to serialize
- * 
+ *
  * Returns:
  * {?}
  */
@@ -22664,31 +22664,31 @@
  */
 OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * Property: type
      * {OpenLayers.Control.TYPES}
      */
     type: OpenLayers.Control.TYPE_TOOL,
-    
+
     /**
      * Property: panned
      * {Boolean} The map moved.
      */
     panned: false,
-    
+
     /**
      * Property: interval
      * {Integer} The number of milliseconds that should ellapse before
      *     panning the map again. Set this to increase dragging performance.
      *     Defaults to 25 milliseconds.
      */
-    interval: 25, 
-    
+    interval: 25,
+
     /**
      * Method: draw
      * Creates a Drag handler, using <panMap> and
      * <panMapDone> as callbacks.
-     */    
+     */
     draw: function() {
         this.handler = new OpenLayers.Handler.Drag(this, {
                 "move": this.panMap,
@@ -22713,7 +22713,7 @@
             {dragging: this.handler.dragging, animate: false}
         );
     },
-    
+
     /**
      * Method: panMapDone
      * Finish the panning operation.  Only call setCenter (through <panMap>)
@@ -22757,28 +22757,28 @@
  * Class: OpenLayers.Feature.Vector
  * Vector features use the OpenLayers.Geometry classes as geometry description.
  * They have an 'attributes' property, which is the data object, and a 'style'
- * property, the default values of which are defined in the 
+ * property, the default values of which are defined in the
  * <OpenLayers.Feature.Vector.style> objects.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Feature>
  */
 OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
 
-    /** 
-     * Property: fid 
-     * {String} 
+    /**
+     * Property: fid
+     * {String}
      */
     fid: null,
-    
-    /** 
-     * APIProperty: geometry 
-     * {<OpenLayers.Geometry>} 
+
+    /**
+     * APIProperty: geometry
+     * {<OpenLayers.Geometry>}
      */
     geometry: null,
 
-    /** 
-     * APIProperty: attributes 
+    /**
+     * APIProperty: attributes
      * {Object} This object holds arbitrary properties that describe the
      *     feature.
      */
@@ -22789,37 +22789,37 @@
      * {<OpenLayers.Bounds>} The box bounding that feature's geometry, that
      *     property can be set by an <OpenLayers.Format> object when
      *     deserializing the feature, so in most cases it represents an
-     *     information set by the server. 
+     *     information set by the server.
      */
     bounds: null,
 
-    /** 
-     * Property: state 
-     * {String} 
+    /**
+     * Property: state
+     * {String}
      */
     state: null,
-    
-    /** 
-     * APIProperty: style 
-     * {Object} 
+
+    /**
+     * APIProperty: style
+     * {Object}
      */
     style: null,
-    
+
     /**
      * Property: renderIntent
      * {String} rendering intent currently being used
      */
     renderIntent: "default",
 
-    /** 
+    /**
      * Constructor: OpenLayers.Feature.Vector
-     * Create a vector feature. 
-     * 
+     * Create a vector feature.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>} The geometry that this feature
      *     represents.
      * attributes - {Object} An optional object that will be mapped to the
-     *     <attributes> property. 
+     *     <attributes> property.
      * style - {Object} An optional style object.
      */
     initialize: function(geometry, attributes, style) {
@@ -22833,10 +22833,10 @@
             this.attributes = OpenLayers.Util.extend(this.attributes,
                                                      attributes);
         }
-        this.style = style ? style : null; 
+        this.style = style ? style : null;
     },
-    
-    /** 
+
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -22845,11 +22845,11 @@
             this.layer.removeFeatures(this);
             this.layer = null;
         }
-            
+
         this.geometry = null;
         OpenLayers.Feature.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: clone
      * Create a clone of this vector feature.  Does not set any non-standard
@@ -22877,7 +22877,7 @@
      * boundsOnly - {Boolean} Only test whether a feature's bounds intersects
      *     the viewport bounds.  Default is false.  If false, the feature's
      *     geometry must intersect the viewport for onScreen to return true.
-     * 
+     *
      * Returns:
      * {Boolean} The feature is currently visible on screen (optionally
      *     based on its bounds if boundsOnly is true).
@@ -22893,15 +22893,15 @@
                 var screenPoly = screenBounds.toGeometry();
                 onScreen = screenPoly.intersects(this.geometry);
             }
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: createMarker
      * HACK - we need to decide if all vector features should be able to
      *     create markers
-     * 
+     *
      * Returns:
      * {<OpenLayers.Marker>} For now just returns null
      */
@@ -22913,7 +22913,7 @@
      * Method: destroyMarker
      * HACK - we need to decide if all vector features should be able to
      *     delete markers
-     * 
+     *
      * If user overrides the createMarker() function, s/he should be able
      *   to also specify an alternative function for destroying it
      */
@@ -22925,7 +22925,7 @@
      * Method: createPopup
      * HACK - we need to decide if all vector features should be able to
      *     create popups
-     * 
+     *
      * Returns:
      * {<OpenLayers.Popup>} For now just returns null
      */
@@ -22936,19 +22936,19 @@
     /**
      * Method: atPoint
      * Determins whether the feature intersects with the specified location.
-     * 
-     * Parameters: 
-     * lonlat - {<OpenLayers.LonLat>} 
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
      * toleranceLon - {float} Optional tolerance in Geometric Coords
      * toleranceLat - {float} Optional tolerance in Geographic Coords
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the feature is at the specified location
      */
     atPoint: function(lonlat, toleranceLon, toleranceLat) {
         var atPoint = false;
         if(this.geometry) {
-            atPoint = this.geometry.atPoint(lonlat, toleranceLon, 
+            atPoint = this.geometry.atPoint(lonlat, toleranceLon,
                                                     toleranceLat);
         }
         return atPoint;
@@ -22984,7 +22984,7 @@
         } else {
             pixel = location;
         }
-        
+
         var lastPixel = this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat());
         var res = this.layer.map.getResolution();
         this.geometry.move(res * (pixel.x - lastPixel.x),
@@ -22992,13 +22992,13 @@
         this.layer.drawFeature(this);
         return lastPixel;
     },
-    
+
     /**
      * Method: toState
      * Sets the new state
      *
      * Parameters:
-     * state - {String} 
+     * state - {String}
      */
     toState: function(state) {
         if (state == OpenLayers.State.UPDATE) {
@@ -23035,24 +23035,24 @@
             this.state = state;
         }
     },
-    
+
     CLASS_NAME: "OpenLayers.Feature.Vector"
 });
 
 
 /**
  * Constant: OpenLayers.Feature.Vector.style
- * OpenLayers features can have a number of style attributes. The 'default' 
+ * OpenLayers features can have a number of style attributes. The 'default'
  *     style will typically be used if no other style is specified. These
  *     styles correspond for the most part, to the styling properties defined
- *     by the SVG standard. 
+ *     by the SVG standard.
  *     Information on fill properties: http://www.w3.org/TR/SVG/painting.html#FillProperties
  *     Information on stroke properties: http://www.w3.org/TR/SVG/painting.html#StrokeProperties
  *
  * Symbolizer properties:
  * fill - {Boolean} Set to false if no fill is desired.
  * fillColor - {String} Hex fill color.  Default is "#ee9900".
- * fillOpacity - {Number} Fill opacity (0-1).  Default is 0.4 
+ * fillOpacity - {Number} Fill opacity (0-1).  Default is 0.4
  * stroke - {Boolean} Set to false if no stroke is desired.
  * strokeColor - {String} Hex stroke color.  Default is "#ee9900".
  * strokeOpacity - {Number} Stroke opacity (0-1).  Default is 1.
@@ -23091,11 +23091,11 @@
  * fontSize - {String} The font size for the label, to be provided like in CSS.
  * fontWeight - {String} The font weight for the label, to be provided like in CSS.
  * display - {String} Symbolizers will have no effect if display is set to "none".  All other values have no effect.
- */ 
+ */
 OpenLayers.Feature.Vector.style = {
     'default': {
         fillColor: "#ee9900",
-        fillOpacity: 0.4, 
+        fillOpacity: 0.4,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "#ee9900",
@@ -23114,7 +23114,7 @@
     },
     'select': {
         fillColor: "blue",
-        fillOpacity: 0.4, 
+        fillOpacity: 0.4,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "blue",
@@ -23133,7 +23133,7 @@
     },
     'temporary': {
         fillColor: "#66cccc",
-        fillOpacity: 0.2, 
+        fillOpacity: 0.2,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "#66cccc",
@@ -23153,7 +23153,7 @@
     'delete': {
         display: "none"
     }
-};    
+};
 /* ======================================================================
     OpenLayers/Handler/Box.js
    ====================================================================== */
@@ -23169,17 +23169,17 @@
 
 /**
  * Class: OpenLayers.Handler.Box
- * Handler for dragging a rectangle across the map.  Box is displayed 
+ * Handler for dragging a rectangle across the map.  Box is displayed
  * on mouse down, moves on mouse move, and is finished on mouse up.
  *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Box = OpenLayers.Class(OpenLayers.Handler, {
 
-    /** 
-     * Property: dragHandler 
-     * {<OpenLayers.Handler.Drag>} 
+    /**
+     * Property: dragHandler
+     * {<OpenLayers.Handler.Drag>}
      */
     dragHandler: null,
 
@@ -23189,7 +23189,7 @@
      *     olHandlerBoxZoomBox
      */
     boxDivClassName: 'olHandlerBoxZoomBox',
-    
+
     /**
      * Property: boxCharacteristics
      * {Object} Caches some box characteristics from css. This is used
@@ -23201,18 +23201,18 @@
      * Constructor: OpenLayers.Handler.Box
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * callbacks - {Object} An object containing a single function to be
      *                          called when the drag operation is finished.
      *                          The callback should expect to recieve a single
      *                          argument, the point geometry.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
         var callbacks = {
-            "down": this.startBox, 
-            "move": this.moveBox, 
+            "down": this.startBox,
+            "move": this.moveBox,
             "out":  this.removeBox,
             "up":   this.endBox
         };
@@ -23234,12 +23234,12 @@
     * Method: startBox
     *
     * Parameters:
-    * evt - {Event} 
+    * evt - {Event}
     */
     startBox: function (xy) {
         this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
                                                  this.dragHandler.start);
-        this.zoomBox.className = this.boxDivClassName;                                         
+        this.zoomBox.className = this.boxDivClassName;
         this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
         this.map.viewPortDiv.appendChild(this.zoomBox);
 
@@ -23281,8 +23281,8 @@
     */
     endBox: function(end) {
         var result;
-        if (Math.abs(this.dragHandler.start.x - end.x) > 5 ||    
-            Math.abs(this.dragHandler.start.y - end.y) > 5) {   
+        if (Math.abs(this.dragHandler.start.x - end.x) > 5 ||
+            Math.abs(this.dragHandler.start.y - end.y) > 5) {
             var start = this.dragHandler.start;
             var top = Math.min(start.y, end.y);
             var bottom = Math.max(start.y, end.y);
@@ -23291,7 +23291,7 @@
             result = new OpenLayers.Bounds(left, bottom, right, top);
         } else {
             result = this.dragHandler.start.clone(); // i.e. OL.Pixel
-        } 
+        }
         this.removeBox();
 
         this.callback("done", [result]);
@@ -23334,11 +23334,11 @@
             return false;
         }
     },
-    
+
     /**
      * Method: getCharacteristics
      * Determines offset and box model for a box.
-     * 
+     *
      * Returns:
      * {Object} a hash with the following properties:
      *     - xOffset - Corner offset in x-direction
@@ -23386,12 +23386,12 @@
  *     down, moves or is modified on mouse move, and is finished on mouse up.
  *     The handler triggers callbacks for 'done' and 'cancel'.  Create a new
  *     instance with the <OpenLayers.Handler.RegularPolygon> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.RegularPolygon = OpenLayers.Class(OpenLayers.Handler.Drag, {
-    
+
     /**
      * APIProperty: sides
      * {Integer} Number of sides for the regular polygon.  Needs to be greater
@@ -23408,15 +23408,15 @@
      *     default.
      */
     radius: null,
-    
+
     /**
      * APIProperty: snapAngle
      * {Float} If set to a non-zero value, the handler will snap the polygon
      *     rotation to multiples of the snapAngle.  Value is an angle measured
-     *     in degrees counterclockwise from the positive x-axis.  
+     *     in degrees counterclockwise from the positive x-axis.
      */
     snapAngle: null,
-    
+
     /**
      * APIProperty: snapToggle
      * {String} If set, snapToggle is checked on mouse events and will set
@@ -23427,7 +23427,7 @@
      *     non-zero value.
      */
     snapToggle: 'shiftKey',
-    
+
     /**
      * APIProperty: persist
      * {Boolean} Leave the feature rendered until clear is called.  Default
@@ -23509,18 +23509,18 @@
                                                 [control, callbacks, options]);
         this.options = (options) ? options : new Object();
     },
-    
+
     /**
      * APIMethod: setOptions
-     * 
+     *
      * Parameters:
-     * newOptions - {Object} 
+     * newOptions - {Object}
      */
     setOptions: function (newOptions) {
         OpenLayers.Util.extend(this.options, newOptions);
         OpenLayers.Util.extend(this, newOptions);
     },
-    
+
     /**
      * APIMethod: activate
      * Turn on the handler.
@@ -23578,7 +23578,7 @@
         }
         return deactivated;
     },
-    
+
     /**
      * Method: down
      * Start drawing a new feature
@@ -23605,7 +23605,7 @@
         this.layer.addFeatures([this.feature], {silent: true});
         this.layer.drawFeature(this.feature, this.style);
     },
-    
+
     /**
      * Method: move
      * Respond to drag move events
@@ -23685,7 +23685,7 @@
             this.origin, this.radius, this.sides, this.snapAngle
         );
     },
-    
+
     /**
      * Method: modifyGeometry
      * Modify the polygon geometry in place.
@@ -23706,7 +23706,7 @@
             point.clearBounds();
         }
     },
-    
+
     /**
      * Method: calculateAngle
      * Calculate the angle based on settings.
@@ -23755,7 +23755,7 @@
         this.layer.renderer.clear();
         this.layer.destroyFeatures();
     },
-    
+
     /**
      * Method: callback
      * Trigger the control's named callback with the given arguments
@@ -23799,21 +23799,21 @@
  * Class: OpenLayers.Layer.EventPane
  * Base class for 3rd party layers.  Create a new event pane layer with the
  * <OpenLayers.Layer.EventPane> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.EventPane = OpenLayers.Class(OpenLayers.Layer, {
-    
+
     /**
      * APIProperty: smoothDragPan
      * {Boolean} smoothDragPan determines whether non-public/internal API
-     *     methods are used for better performance while dragging EventPane 
-     *     layers. When not in sphericalMercator mode, the smoother dragging 
-     *     doesn't actually move north/south directly with the number of 
-     *     pixels moved, resulting in a slight offset when you drag your mouse 
-     *     north south with this option on. If this visual disparity bothers 
-     *     you, you should turn this option off, or use spherical mercator. 
+     *     methods are used for better performance while dragging EventPane
+     *     layers. When not in sphericalMercator mode, the smoother dragging
+     *     doesn't actually move north/south directly with the number of
+     *     pixels moved, resulting in a slight offset when you drag your mouse
+     *     north south with this option on. If this visual disparity bothers
+     *     you, you should turn this option off, or use spherical mercator.
      *     Default is on.
      */
     smoothDragPan: true,
@@ -23821,13 +23821,13 @@
     /**
      * Property: isBaseLayer
      * {Boolean} EventPaned layers are always base layers, by necessity.
-     */ 
+     */
     isBaseLayer: true,
 
     /**
      * APIProperty: isFixed
      * {Boolean} EventPaned layers are fixed by default.
-     */ 
+     */
     isFixed: true,
 
     /**
@@ -23840,9 +23840,9 @@
     /**
      * Property: mapObject
      * {Object} This is the object which will be used to load the 3rd party library
-     * in the case of the google layer, this will be of type GMap, 
+     * in the case of the google layer, this will be of type GMap,
      * in the case of the ve layer, this will be of type VEMap
-     */ 
+     */
     mapObject: null,
 
 
@@ -23860,35 +23860,35 @@
             this.pane = OpenLayers.Util.createDiv(this.div.id + "_EventPane");
         }
     },
-    
+
     /**
      * APIMethod: destroy
      * Deconstruct this layer.
      */
     destroy: function() {
         this.mapObject = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
 
-    
+
     /**
      * Method: setMap
      * Set the map property for the layer. This is done through an accessor
-     * so that subclasses can override this and take special action once 
-     * they have their map variable set. 
+     * so that subclasses can override this and take special action once
+     * they have their map variable set.
      *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         OpenLayers.Layer.prototype.setMap.apply(this, arguments);
-        
+
         this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
         this.pane.style.display = this.div.style.display;
         this.pane.style.width="100%";
         this.pane.style.height="100%";
         if (OpenLayers.Util.getBrowserName() == "msie") {
-            this.pane.style.background = 
+            this.pane.style.background =
                 "url(" + OpenLayers.Util.getImagesLocation() + "blank.gif)";
         }
 
@@ -23900,7 +23900,7 @@
 
         // once our layer has been added to the map, we can load it
         this.loadMapObject();
-    
+
         // if map didn't load, display warning
         if (this.mapObject == null) {
             this.loadWarningMessage();
@@ -23910,8 +23910,8 @@
     /**
      * APIMethod: removeMap
      * On being removed from the map, we'll like to remove the invisible 'pane'
-     *     div that we added to it on creation. 
-     * 
+     *     div that we added to it on creation.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -23922,14 +23922,14 @@
         }
         OpenLayers.Layer.prototype.removeMap.apply(this, arguments);
     },
-  
+
     /**
      * Method: loadWarningMessage
-     * If we can't load the map lib, then display an error message to the 
+     * If we can't load the map lib, then display an error message to the
      *     user and tell them where to go for help.
-     * 
+     *
      *     This function sets up the layout for the warning message. Each 3rd
-     *     party layer must implement its own getWarningHTML() function to 
+     *     party layer must implement its own getWarningHTML() function to
      *     provide the actual warning message.
      */
     loadWarningMessage:function() {
@@ -23937,17 +23937,17 @@
         this.div.style.backgroundColor = "darkblue";
 
         var viewSize = this.map.getSize();
-        
+
         var msgW = Math.min(viewSize.w, 300);
         var msgH = Math.min(viewSize.h, 200);
         var size = new OpenLayers.Size(msgW, msgH);
 
         var centerPx = new OpenLayers.Pixel(viewSize.w/2, viewSize.h/2);
 
-        var topLeft = centerPx.add(-size.w/2, -size.h/2);            
+        var topLeft = centerPx.add(-size.w/2, -size.h/2);
 
-        var div = OpenLayers.Util.createDiv(this.name + "_warning", 
-                                            topLeft, 
+        var div = OpenLayers.Util.createDiv(this.name + "_warning",
+                                            topLeft,
                                             size,
                                             null,
                                             null,
@@ -23960,11 +23960,11 @@
         div.innerHTML = this.getWarningHTML();
         this.div.appendChild(div);
     },
-  
-    /** 
+
+    /**
      * Method: getWarningHTML
      * To be implemented by subclasses.
-     * 
+     *
      * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
@@ -23973,7 +23973,7 @@
         //should be implemented by subclasses
         return "";
     },
-  
+
     /**
      * Method: display
      * Set the display on the pane
@@ -23985,11 +23985,11 @@
         OpenLayers.Layer.prototype.display.apply(this, arguments);
         this.pane.style.display = this.div.style.display;
     },
-  
+
     /**
      * Method: setZIndex
      * Set the z-index order for the pane.
-     * 
+     *
      * Parameters:
      * zIndex - {int}
      */
@@ -24001,7 +24001,7 @@
     /**
      * Method: moveTo
      * Handle calls to move the layer.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * zoomChanged - {Boolean}
@@ -24023,10 +24023,10 @@
                 var moOldZoom = this.getMapObjectZoom();
                 var oldZoom= this.getOLZoomFromMapObjectZoom(moOldZoom);
 
-                if ( !(newCenter.equals(oldCenter)) || 
+                if ( !(newCenter.equals(oldCenter)) ||
                      !(newZoom == oldZoom) ) {
 
-                    if (dragging && this.dragPanMapObject && 
+                    if (dragging && this.dragPanMapObject &&
                         this.smoothDragPan) {
                         var oldPx = this.map.getViewPortPxFromLonLat(oldCenter);
                         var newPx = this.map.getViewPortPxFromLonLat(newCenter);
@@ -24051,7 +24051,7 @@
     /**
      * Method: getLonLatFromViewPortPx
      * Get a map location from a pixel location
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
      *
@@ -24062,7 +24062,7 @@
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
         var lonlat = null;
-        if ( (this.mapObject != null) && 
+        if ( (this.mapObject != null) &&
              (this.getMapObjectCenter() != null) ) {
             var moPixel = this.getMapObjectPixelFromOLPixel(viewPortPx);
             var moLonLat = this.getMapObjectLonLatFromMapObjectPixel(moPixel);
@@ -24071,7 +24071,7 @@
         return lonlat;
     },
 
- 
+
     /**
      * Method: getViewPortPxFromLonLat
      * Get a pixel location from a map location
@@ -24086,12 +24086,12 @@
      */
     getViewPortPxFromLonLat: function (lonlat) {
         var viewPortPx = null;
-        if ( (this.mapObject != null) && 
+        if ( (this.mapObject != null) &&
              (this.getMapObjectCenter() != null) ) {
 
             var moLonLat = this.getMapObjectLonLatFromOLLonLat(lonlat);
             var moPixel = this.getMapObjectPixelFromMapObjectLonLat(moLonLat);
-        
+
             viewPortPx = this.getOLPixelFromMapObjectPixel(moPixel);
         }
         return viewPortPx;
@@ -24116,9 +24116,9 @@
      *
      * Parameters
      * moLonLat - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat, translated from the passed in 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat, translated from the passed in
      *          MapObject LonLat
      *          Returns null if null value is passed in
      */
@@ -24138,9 +24138,9 @@
      *
      * Parameters:
      * olLonLat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {Object} A MapObject LonLat, translated from the passed in 
+     * {Object} A MapObject LonLat, translated from the passed in
      *          OpenLayers.LonLat
      *          Returns null if null value is passed in
      */
@@ -24164,9 +24164,9 @@
      *
      * Parameters:
      * moPixel - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel, translated from the passed in 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel, translated from the passed in
      *          MapObject Pixel
      *          Returns null if null value is passed in
      */
@@ -24186,9 +24186,9 @@
      *
      * Parameters:
      * olPixel - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {Object} A MapObject Pixel, translated from the passed in 
+     * {Object} A MapObject Pixel, translated from the passed in
      *          OpenLayers.Pixel
      *          Returns null if null value is passed in
      */
@@ -24216,47 +24216,47 @@
 
 /**
  * Class: OpenLayers.Layer.FixedZoomLevels
- *   Some Layers will already have established zoom levels (like google 
+ *   Some Layers will already have established zoom levels (like google
  *    or ve). Instead of trying to determine them and populate a resolutions[]
  *    Array with those values, we will hijack the resolution functionality
  *    here.
- * 
- *   When you subclass FixedZoomLevels: 
- * 
- *   The initResolutions() call gets nullified, meaning no resolutions[] array 
- *    is set up. Which would be a big problem getResolution() in Layer, since 
+ *
+ *   When you subclass FixedZoomLevels:
+ *
+ *   The initResolutions() call gets nullified, meaning no resolutions[] array
+ *    is set up. Which would be a big problem getResolution() in Layer, since
  *    it merely takes map.zoom and indexes into resolutions[]... but....
- * 
- *   The getResolution() call is also overridden. Instead of using the 
+ *
+ *   The getResolution() call is also overridden. Instead of using the
  *    resolutions[] array, we simply calculate the current resolution based
  *    on the current extent and the current map size. But how will we be able
  *    to calculate the current extent without knowing the resolution...?
- *  
+ *
  *   The getExtent() function is also overridden. Instead of calculating extent
- *    based on the center point and the current resolution, we instead 
- *    calculate the extent by getting the lonlats at the top-left and 
+ *    based on the center point and the current resolution, we instead
+ *    calculate the extent by getting the lonlats at the top-left and
  *    bottom-right by using the getLonLatFromViewPortPx() translation function,
- *    taken from the pixel locations (0,0) and the size of the map. But how 
+ *    taken from the pixel locations (0,0) and the size of the map. But how
  *    will we be able to do lonlat-px translation without resolution....?
- * 
+ *
  *   The getZoomForResolution() method is overridden. Instead of indexing into
  *    the resolutions[] array, we call OpenLayers.Layer.getExent(), passing in
- *    the desired resolution. With this extent, we then call getZoomForExtent() 
- * 
- * 
- *   Whenever you implement a layer using OpenLayers.Layer.FixedZoomLevels, 
+ *    the desired resolution. With this extent, we then call getZoomForExtent()
+ *
+ *
+ *   Whenever you implement a layer using OpenLayers.Layer.FixedZoomLevels,
  *    it is your responsibility to provide the following three functions:
- * 
+ *
  *   - getLonLatFromViewPortPx
  *   - getViewPortPxFromLonLat
  *   - getZoomForExtent
- * 
- *  ...those three functions should generally be provided by any reasonable 
+ *
+ *  ...those three functions should generally be provided by any reasonable
  *  API that you might be working from.
  *
  */
 OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class({
-      
+
   /********************************************************/
   /*                                                      */
   /*                 Baselayer Functions                  */
@@ -24265,19 +24265,19 @@
   /*                  by all base layers                  */
   /*                                                      */
   /********************************************************/
-    
+
     /**
      * Constructor: OpenLayers.Layer.FixedZoomLevels
      * Create a new fixed zoom levels layer.
      */
     initialize: function() {
-        //this class is only just to add the following functions... 
+        //this class is only just to add the following functions...
         // nothing to actually do here... but it is probably a good
-        // idea to have layers that use these functions call this 
-        // inititalize() anyways, in case at some point we decide we 
-        // do want to put some functionality or state in here. 
+        // idea to have layers that use these functions call this
+        // inititalize() anyways, in case at some point we decide we
+        // do want to put some functionality or state in here.
     },
-    
+
     /**
      * Method: initResolutions
      * Populate the resolutions array
@@ -24285,64 +24285,64 @@
     initResolutions: function() {
 
         var props = new Array('minZoomLevel', 'maxZoomLevel', 'numZoomLevels');
-          
+
         for(var i=0, len=props.length; i<len; i++) {
             var property = props[i];
-            this[property] = (this.options[property] != null)  
-                                     ? this.options[property] 
+            this[property] = (this.options[property] != null)
+                                     ? this.options[property]
                                      : this.map[property];
         }
 
         if ( (this.minZoomLevel == null) ||
              (this.minZoomLevel < this.MIN_ZOOM_LEVEL) ){
             this.minZoomLevel = this.MIN_ZOOM_LEVEL;
-        }        
+        }
 
         //
         // At this point, we know what the minimum desired zoom level is, and
-        //  we must calculate the total number of zoom levels. 
-        //  
+        //  we must calculate the total number of zoom levels.
+        //
         //  Because we allow for the setting of either the 'numZoomLevels'
-        //   or the 'maxZoomLevel' properties... on either the layer or the  
+        //   or the 'maxZoomLevel' properties... on either the layer or the
         //   map, we have to define some rules to see which we take into
-        //   account first in this calculation. 
+        //   account first in this calculation.
         //
         // The following is the precedence list for these properties:
-        // 
+        //
         // (1) numZoomLevels set on layer
         // (2) maxZoomLevel set on layer
         // (3) numZoomLevels set on map
         // (4) maxZoomLevel set on map*
         // (5) none of the above*
         //
-        // *Note that options (4) and (5) are only possible if the user 
-        //  _explicitly_ sets the 'numZoomLevels' property on the map to 
-        //  null, since it is set by default to 16. 
+        // *Note that options (4) and (5) are only possible if the user
+        //  _explicitly_ sets the 'numZoomLevels' property on the map to
+        //  null, since it is set by default to 16.
         //
 
         //
-        // Note to future: In 3.0, I think we should remove the default 
-        // value of 16 for map.numZoomLevels. Rather, I think that value 
+        // Note to future: In 3.0, I think we should remove the default
+        // value of 16 for map.numZoomLevels. Rather, I think that value
         // should be set as a default on the Layer.WMS class. If someone
-        // creates a 3rd party layer and does not specify any 'minZoomLevel', 
-        // 'maxZoomLevel', or 'numZoomLevels', and has not explicitly 
+        // creates a 3rd party layer and does not specify any 'minZoomLevel',
+        // 'maxZoomLevel', or 'numZoomLevels', and has not explicitly
         // specified any of those on the map object either.. then I think
         // it is fair to say that s/he wants all the zoom levels available.
-        // 
-        // By making map.numZoomLevels *null* by default, that will be the 
+        //
+        // By making map.numZoomLevels *null* by default, that will be the
         // case. As it is, I don't feel comfortable changing that right now
         // as it would be a glaring API change and actually would probably
-        // break many peoples' codes. 
+        // break many peoples' codes.
         //
 
         //the number of zoom levels we'd like to have.
         var desiredZoomLevels;
 
-        //this is the maximum number of zoom levels the layer will allow, 
+        //this is the maximum number of zoom levels the layer will allow,
         // given the specified starting minimum zoom level.
         var limitZoomLevels = this.MAX_ZOOM_LEVEL - this.minZoomLevel + 1;
 
-        if ( ((this.options.numZoomLevels == null) && 
+        if ( ((this.options.numZoomLevels == null) &&
               (this.options.maxZoomLevel != null)) // (2)
               ||
              ((this.numZoomLevels == null) &&
@@ -24359,18 +24359,18 @@
         if (desiredZoomLevels != null) {
             //Now that we know what we would *like* the number of zoom levels
             // to be, based on layer or map options, we have to make sure that
-            // it does not conflict with the actual limit, as specified by 
+            // it does not conflict with the actual limit, as specified by
             // the constants on the layer itself (and calculated into the
-            // 'limitZoomLevels' variable). 
+            // 'limitZoomLevels' variable).
             this.numZoomLevels = Math.min(desiredZoomLevels, limitZoomLevels);
         } else {
-            // case (5) -- neither 'numZoomLevels' not 'maxZoomLevel' was 
-            // set on either the layer or the map. So we just use the 
+            // case (5) -- neither 'numZoomLevels' not 'maxZoomLevel' was
+            // set on either the layer or the map. So we just use the
             // maximum limit as calculated by the layer's constants.
             this.numZoomLevels = limitZoomLevels;
         }
 
-        //now that the 'numZoomLevels' is appropriately, safely set, 
+        //now that the 'numZoomLevels' is appropriately, safely set,
         // we go back and re-calculate the 'maxZoomLevel'.
         this.maxZoomLevel = this.minZoomLevel + this.numZoomLevels - 1;
 
@@ -24378,17 +24378,17 @@
             var resolutionsIndex = 0;
             this.resolutions = [];
             for(var i= this.minZoomLevel; i <= this.maxZoomLevel; i++) {
-                this.resolutions[resolutionsIndex++] = this.RESOLUTIONS[i];            
+                this.resolutions[resolutionsIndex++] = this.RESOLUTIONS[i];
             }
             this.maxResolution = this.resolutions[0];
             this.minResolution = this.resolutions[this.resolutions.length - 1];
-        }       
+        }
     },
-    
+
     /**
      * APIMethod: getResolution
      * Get the current map resolution
-     * 
+     *
      * Returns:
      * {Float} Map units per Pixel
      */
@@ -24398,10 +24398,10 @@
             return OpenLayers.Layer.prototype.getResolution.apply(this, arguments);
         } else {
             var resolution = null;
-            
+
             var viewSize = this.map.getSize();
             var extent = this.getExtent();
-            
+
             if ((viewSize != null) && (extent != null)) {
                 resolution = Math.max( extent.getWidth()  / viewSize.w,
                                        extent.getHeight() / viewSize.h );
@@ -24412,29 +24412,29 @@
 
     /**
      * APIMethod: getExtent
-     * Calculates using px-> lonlat translation functions on tl and br 
+     * Calculates using px-> lonlat translation functions on tl and br
      *     corners of viewport
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
      *                       bounds of the current viewPort.
      */
     getExtent: function () {
         var extent = null;
-        
-        
+
+
         var size = this.map.getSize();
-        
+
         var tlPx = new OpenLayers.Pixel(0,0);
         var tlLL = this.getLonLatFromViewPortPx(tlPx);
 
         var brPx = new OpenLayers.Pixel(size.w, size.h);
         var brLL = this.getLonLatFromViewPortPx(brPx);
-        
+
         if ((tlLL != null) && (brLL != null)) {
-            extent = new OpenLayers.Bounds(tlLL.lon, 
-                                       brLL.lat, 
-                                       brLL.lon, 
+            extent = new OpenLayers.Bounds(tlLL.lon,
+                                       brLL.lat,
+                                       brLL.lon,
                                        tlLL.lat);
         }
 
@@ -24453,7 +24453,7 @@
      *           If no baselayer is set, returns null.
      */
     getZoomForResolution: function(resolution) {
-      
+
         if (this.resolutions != null) {
             return OpenLayers.Layer.prototype.getZoomForResolution.apply(this, arguments);
         } else {
@@ -24464,28 +24464,28 @@
 
 
 
-    
+
     /********************************************************/
     /*                                                      */
     /*             Translation Functions                    */
     /*                                                      */
-    /*    The following functions translate GMaps and OL    */ 
+    /*    The following functions translate GMaps and OL    */
     /*     formats for Pixel, LonLat, Bounds, and Zoom      */
     /*                                                      */
     /********************************************************/
-    
-    
+
+
     //
     // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
     //
-  
+
     /**
      * Method: getOLZoomFromMapObjectZoom
      * Get the OL zoom index from the map object zoom level
      *
      * Parameters:
      * moZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} An OpenLayers Zoom level, translated from the passed in zoom
      *           Returns null if null value is passed in
@@ -24497,20 +24497,20 @@
         }
         return zoom;
     },
-    
+
     /**
      * Method: getMapObjectZoomFromOLZoom
      * Get the map object zoom level from the OL zoom level
      *
      * Parameters:
      * olZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} A MapObject level, translated from the passed in olZoom
      *           Returns null if null value is passed in
      */
     getMapObjectZoomFromOLZoom: function(olZoom) {
-        var zoom = null; 
+        var zoom = null;
         if (olZoom != null) {
             zoom = olZoom + this.minZoomLevel;
         }
@@ -24535,47 +24535,47 @@
 
 /**
  * Class: OpenLayers.Layer.HTTPRequest
- * 
- * Inherits from: 
+ *
+ * Inherits from:
  *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
 
-    /** 
+    /**
      * Constant: URL_HASH_FACTOR
      * {Float} Used to hash URL param strings for multi-WMS server selection.
      *         Set to the Golden Ratio per Knuth's recommendation.
      */
     URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
 
-    /** 
+    /**
      * Property: url
-     * {Array(String) or String} This is either an array of url strings or 
-     *                           a single url string. 
+     * {Array(String) or String} This is either an array of url strings or
+     *                           a single url string.
      */
     url: null,
 
-    /** 
+    /**
      * Property: params
      * {Object} Hashtable of key/value parameters
      */
     params: null,
-    
-    /** 
+
+    /**
      * APIProperty: reproject
      * *Deprecated*. See http://trac.openlayers.org/wiki/SpatialMercator
-     * for information on the replacement for this functionality. 
-     * {Boolean} Whether layer should reproject itself based on base layer 
-     *           locations. This allows reprojection onto commercial layers. 
-     *           Default is false: Most layers can't reproject, but layers 
+     * for information on the replacement for this functionality.
+     * {Boolean} Whether layer should reproject itself based on base layer
+     *           locations. This allows reprojection onto commercial layers.
+     *           Default is false: Most layers can't reproject, but layers
      *           which can create non-square geographic pixels can, like WMS.
-     *           
+     *
      */
     reproject: false,
 
     /**
      * Constructor: OpenLayers.Layer.HTTPRequest
-     * 
+     *
      * Parameters:
      * name - {String}
      * url - {Array(String) or String}
@@ -24596,39 +24596,39 @@
     destroy: function() {
         this.url = null;
         this.params = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: clone
-     * 
+     *
      * Parameters:
      * obj - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Layer.HTTPRequest>} An exact clone of this 
+     * {<OpenLayers.Layer.HTTPRequest>} An exact clone of this
      *                                  <OpenLayers.Layer.HTTPRequest>
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.HTTPRequest(this.name,
                                                    this.url,
                                                    this.params,
                                                    this.options);
         }
-        
+
         //get all additions from superclasses
         obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
 
         // copy/set any non-init, non-simple values here
-        
+
         return obj;
     },
 
-    /** 
+    /**
      * APIMethod: setUrl
-     * 
+     *
      * Parameters:
      * newUrl - {String}
      */
@@ -24638,7 +24638,7 @@
 
     /**
      * APIMethod: mergeNewParams
-     * 
+     *
      * Parameters:
      * newParams - {Object}
      *
@@ -24660,18 +24660,18 @@
      * Returns:
      * {Boolean} The layer was redrawn.
      */
-    redraw: function(force) { 
+    redraw: function(force) {
         if (force) {
             return this.mergeNewParams({"_olSalt": Math.random()});
         } else {
             return OpenLayers.Layer.prototype.redraw.apply(this, []);
         }
     },
-    
+
     /**
      * Method: selectUrl
      * selectUrl() implements the standard floating-point multiplicative
-     *     hash function described by Knuth, and hashes the contents of the 
+     *     hash function described by Knuth, and hashes the contents of the
      *     given param string into a float between 0 and 1. This float is then
      *     scaled to the size of the provided urls array, and used to select
      *     a URL.
@@ -24679,60 +24679,60 @@
      * Parameters:
      * paramString - {String}
      * urls - {Array(String)}
-     * 
+     *
      * Returns:
      * {String} An entry from the urls array, deterministically selected based
      *          on the paramString.
      */
     selectUrl: function(paramString, urls) {
         var product = 1;
-        for (var i=0, len=paramString.length; i<len; i++) { 
-            product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR; 
-            product -= Math.floor(product); 
+        for (var i=0, len=paramString.length; i<len; i++) {
+            product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR;
+            product -= Math.floor(product);
         }
         return urls[Math.floor(product * urls.length)];
     },
 
-    /** 
+    /**
      * Method: getFullRequestString
-     * Combine url with layer's params and these newParams. 
-     *   
-     *    does checking on the serverPath variable, allowing for cases when it 
-     *     is supplied with trailing ? or &, as well as cases where not. 
+     * Combine url with layer's params and these newParams.
      *
+     *    does checking on the serverPath variable, allowing for cases when it
+     *     is supplied with trailing ? or &, as well as cases where not.
+     *
      *    return in formatted string like this:
      *        "server?key1=value1&key2=value2&key3=value3"
-     * 
+     *
      * WARNING: The altUrl parameter is deprecated and will be removed in 3.0.
      *
      * Parameters:
      * newParams - {Object}
      * altUrl - {String} Use this as the url instead of the layer's url
-     *   
-     * Returns: 
+     *
+     * Returns:
      * {String}
      */
     getFullRequestString:function(newParams, altUrl) {
 
         // if not altUrl passed in, use layer's url
         var url = altUrl || this.url;
-        
-        // create a new params hashtable with all the layer params and the 
+
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
-        // if url is not a string, it should be an array of strings, 
-        // in which case we will deterministically select one of them in 
+
+        // if url is not a string, it should be an array of strings,
+        // in which case we will deterministically select one of them in
         // order to evenly distribute requests to different urls.
         //
         if (url instanceof Array) {
             url = this.selectUrl(paramsString, url);
-        }   
- 
+        }
+
         // ignore parameters that are already in the url search string
-        var urlParams = 
+        var urlParams =
             OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));
         for(var key in allParams) {
             if(key.toUpperCase() in urlParams) {
@@ -24740,10 +24740,10 @@
             }
         }
         paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         // requestString always starts with url
-        var requestString = url;        
-        
+        var requestString = url;
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -24753,7 +24753,7 @@
                     //serverPath has no ? -- add one
                     requestString += '?' + paramsString;
                 } else {
-                    //serverPath contains ?, so must already have 
+                    //serverPath contains ?, so must already have
                     // paramsString at the end
                     requestString += '&' + paramsString;
                 }
@@ -24779,49 +24779,49 @@
 
 /**
  * Class: OpenLayers.Layer.Markers
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Layer> 
+ *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, {
-    
-    /** 
-     * APIProperty: isBaseLayer 
-     * {Boolean} Markers layer is never a base layer.  
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} Markers layer is never a base layer.
      */
     isBaseLayer: false,
-    
-    /** 
-     * APIProperty: markers 
-     * {Array(<OpenLayers.Marker>)} internal marker list 
+
+    /**
+     * APIProperty: markers
+     * {Array(<OpenLayers.Marker>)} internal marker list
      */
     markers: null,
 
 
-    /** 
-     * Property: drawn 
+    /**
+     * Property: drawn
      * {Boolean} internal state of drawing. This is a workaround for the fact
      * that the map does not call moveTo with a zoomChanged when the map is
      * first starting up. This lets us catch the case where we have *never*
      * drawn the layer, and draw it even if the zoom hasn't changed.
      */
     drawn: false,
-    
+
     /**
-     * Constructor: OpenLayers.Layer.Markers 
+     * Constructor: OpenLayers.Layer.Markers
      * Create a Markers layer.
      *
      * Parameters:
-     * name - {String} 
+     * name - {String}
      * options - {Object} Hashtable of extra options to tag onto the layer
      */
     initialize: function(name, options) {
         OpenLayers.Layer.prototype.initialize.apply(this, arguments);
         this.markers = [];
     },
-    
+
     /**
-     * APIMethod: destroy 
+     * APIMethod: destroy
      */
     destroy: function() {
         this.clearMarkers();
@@ -24832,7 +24832,7 @@
     /**
      * APIMethod: setOpacity
      * Sets the opacity for all the markers.
-     * 
+     *
      * Parameter:
      * opacity - {Float}
      */
@@ -24845,13 +24845,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: moveTo
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * zoomChanged - {Boolean} 
-     * dragging - {Boolean} 
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
      */
     moveTo:function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
@@ -24868,7 +24868,7 @@
      * APIMethod: addMarker
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     addMarker: function(marker) {
         this.markers.push(marker);
@@ -24887,7 +24887,7 @@
      * APIMethod: removeMarker
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     removeMarker: function(marker) {
         if (this.markers && this.markers.length) {
@@ -24909,13 +24909,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: drawMarker
-     * Calculate the pixel location for the marker, create it, and 
+     * Calculate the pixel location for the marker, create it, and
      *    add it to the layer's div
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     drawMarker: function(marker) {
         var px = this.map.getLayerPxFromLonLat(marker.lonlat);
@@ -24930,17 +24930,17 @@
             }
         }
     },
-    
-    /** 
+
+    /**
      * APIMethod: getDataExtent
      * Calculates the max extent which includes all of the markers.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
     getDataExtent: function () {
         var maxExtent = null;
-        
+
         if ( this.markers && (this.markers.length > 0)) {
             var maxExtent = new OpenLayers.Bounds();
             for(var i=0, len=this.markers.length; i<len; i++) {
@@ -24982,12 +24982,12 @@
  *
  * WKT:
  *     900913=PROJCS["WGS84 / Simple Mercator", GEOGCS["WGS 84",
- *     DATUM["WGS_1984", SPHEROID["WGS_1984", 6378137.0, 298.257223563]], 
- *     PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295], 
+ *     DATUM["WGS_1984", SPHEROID["WGS_1984", 6378137.0, 298.257223563]],
+ *     PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295],
  *     AXIS["Longitude", EAST], AXIS["Latitude", NORTH]],
- *     PROJECTION["Mercator_1SP_Google"], 
- *     PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], 
- *     PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], 
+ *     PROJECTION["Mercator_1SP_Google"],
+ *     PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0],
+ *     PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0],
  *     PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST],
  *     AXIS["y", NORTH], AUTHORITY["EPSG","900913"]]
  */
@@ -25010,8 +25010,8 @@
         return extent;
     },
 
-    /** 
-     * Method: initMercatorParameters 
+    /**
+     * Method: initMercatorParameters
      * Set up the mercator parameters on the layer: resolutions,
      *     projection, units.
      */
@@ -25031,9 +25031,9 @@
      * Given a lon,lat in EPSG:4326, return a point in Spherical Mercator.
      *
      * Parameters:
-     * lon - {float} 
+     * lon - {float}
      * lat - {float}
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The coordinates transformed to Mercator.
      */
@@ -25042,7 +25042,7 @@
         var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
 
         y = y * 20037508.34 / 180;
-        
+
         return new OpenLayers.LonLat(x, y);
     },
 
@@ -25053,7 +25053,7 @@
      * Parameters:
      * x - {float} A map x in Spherical Mercator.
      * y - {float} A map y in Spherical Mercator.
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The coordinates transformed to EPSG:4326.
      */
@@ -25063,19 +25063,19 @@
         var lat = (y / 20037508.34) * 180;
 
         lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
-        
+
         return new OpenLayers.LonLat(lon, lat);
     },
 
     /**
-     * Method: projectForward 
+     * Method: projectForward
      * Given an object with x and y properties in EPSG:4326, modify the x,y
      * properties on the object to be the Spherical Mercator projected
      * coordinates.
      *
      * Parameters:
-     * point - {Object} An object with x and y properties. 
-     * 
+     * point - {Object} An object with x and y properties.
+     *
      * Returns:
      * {Object} The point, with the x and y properties transformed to spherical
      * mercator.
@@ -25086,15 +25086,15 @@
         point.y = lonlat.lat;
         return point;
     },
-    
+
     /**
      * Method: projectInverse
      * Given an object with x and y properties in Spherical Mercator, modify
      * the x,y properties on the object to be the unprojected coordinates.
      *
      * Parameters:
-     * point - {Object} An object with x and y properties. 
-     * 
+     * point - {Object} An object with x and y properties.
+     *
      * Returns:
      * {Object} The point, with the x and y properties transformed from
      * spherical mercator to unprojected coordinates..
@@ -25140,7 +25140,7 @@
  *  - <OpenLayers.Control>
  */
 OpenLayers.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control, {
-    
+
     /**
      * Property: layer
      * {<OpenLayers.Layer.Vector>}
@@ -25152,7 +25152,7 @@
      * {Object} The functions that are sent to the handler for callback
      */
     callbacks: null,
-    
+
     /**
      * Constant: EVENT_TYPES
      *
@@ -25160,7 +25160,7 @@
      * featureadded - Triggered when a feature is added
      */
     EVENT_TYPES: ["featureadded"],
-    
+
     /**
      * APIProperty: featureAdded
      * {Function} Called after each feature is added
@@ -25172,23 +25172,23 @@
      * {Object} Used to set non-default properties on the control's handler
      */
     handlerOptions: null,
-    
+
     /**
      * Constructor: OpenLayers.Control.DrawFeature
-     * 
+     *
      * Parameters:
-     * layer - {<OpenLayers.Layer.Vector>} 
-     * handler - {<OpenLayers.Handler>} 
-     * options - {Object} 
+     * layer - {<OpenLayers.Layer.Vector>}
+     * handler - {<OpenLayers.Handler>}
+     * options - {Object}
      */
     initialize: function(layer, handler, options) {
-        
+
         // concatenate events specific to vector with those from the base
         this.EVENT_TYPES =
             OpenLayers.Control.DrawFeature.prototype.EVENT_TYPES.concat(
             OpenLayers.Control.prototype.EVENT_TYPES
         );
-        
+
         OpenLayers.Control.prototype.initialize.apply(this, [options]);
         this.callbacks = OpenLayers.Util.extend(
             {
@@ -25284,20 +25284,20 @@
      * {Object} Used to set non-default properties on the control's handler
      */
     handlerOptions: null,
-    
+
     /**
      * Property: callbacks
      * {Object} The functions that are sent to the handler for callback
      */
     callbacks: null,
-    
+
     /**
      * Property: displaySystem
      * {String} Display system for output measurements.  Supported values
      *     are 'english', 'metric', and 'geographic'.  Default is 'metric'.
      */
     displaySystem: 'metric',
-    
+
     /**
      * Property: geodesic
      * {Boolean} Calculate geodesic metrics instead of planar metrics.  This
@@ -25305,7 +25305,7 @@
      *     (if that is not already the map projection).  Default is false.
      */
     geodesic: false,
-    
+
     /**
      * Property: displaySystemUnits
      * {Object} Units for various measurement systems.  Values are arrays
@@ -25334,7 +25334,7 @@
      * {Number} Timeout id of trigger for measurepartial.
      */
     delayedTrigger: null,
-    
+
     /**
      * APIProperty: persist
      * {Boolean} Keep the temporary measurement sketch drawn after the
@@ -25346,10 +25346,10 @@
 
     /**
      * Constructor: OpenLayers.Control.Measure
-     * 
+     *
      * Parameters:
-     * handler - {<OpenLayers.Handler>} 
-     * options - {Object} 
+     * handler - {<OpenLayers.Handler>}
+     * options - {Object}
      */
     initialize: function(handler, options) {
         // concatenate events specific to measure with those from the base
@@ -25363,14 +25363,14 @@
             this.callbacks
         );
 
-        // let the handler options override, so old code that passes 'persist' 
+        // let the handler options override, so old code that passes 'persist'
         // directly to the handler does not need an update
         this.handlerOptions = OpenLayers.Util.extend(
             {persist: this.persist}, this.handlerOptions
         );
         this.handler = new handler(this, this.callbacks, this.handlerOptions);
     },
-    
+
     /**
      * APIMethod: cancel
      * Stop the control from measuring.  If <persist> is true, the temporary
@@ -25379,7 +25379,7 @@
     cancel: function() {
         this.handler.cancel();
     },
-    
+
     /**
      * Method: updateHandler
      *
@@ -25411,7 +25411,7 @@
         }
         this.measure(geometry, "measure");
     },
-    
+
     /**
      * Method: measurePartial
      * Called each time a new point is added to the measurement sketch.
@@ -25452,7 +25452,7 @@
             geometry: geometry
         });
     },
-    
+
     /**
      * Method: getBestArea
      * Based on the <displaySystem> returns the area of a geometry.
@@ -25476,7 +25476,7 @@
         }
         return [area, unit];
     },
-    
+
     /**
      * Method: getArea
      *
@@ -25503,7 +25503,7 @@
         }
         return area;
     },
-    
+
     /**
      * Method: getBestLength
      * Based on the <displaySystem> returns the length of a geometry.
@@ -25572,8 +25572,8 @@
 
 /**
  * Class: OpenLayers.Control.ZoomBox
- * The ZoomBox control enables zooming directly to a given extent, by drawing 
- * a box on the map. The box is drawn by holding down shift, whilst dragging 
+ * The ZoomBox control enables zooming directly to a given extent, by drawing
+ * a box on the map. The box is drawn by holding down shift, whilst dragging
  * the mouse.
  *
  * Inherits from:
@@ -25594,13 +25594,13 @@
 
     /**
      * Property: alwaysZoom
-     * {Boolean} Always zoom in/out, when box drawed 
+     * {Boolean} Always zoom in/out, when box drawed
      */
     alwaysZoom: false,
 
     /**
      * Method: draw
-     */    
+     */
     draw: function() {
         this.handler = new OpenLayers.Handler.Box( this,
                             {done: this.zoomBox}, {keyMask: this.keyMask} );
@@ -25635,11 +25635,11 @@
                 var ymax = center.lat + (extent.getHeight()/2)*zoomFactor;
                 var bounds = new OpenLayers.Bounds(xmin, ymin, xmax, ymax);
             }
-            // always zoom in/out 
-            var lastZoom = this.map.getZoom(); 
+            // always zoom in/out
+            var lastZoom = this.map.getZoom();
             this.map.zoomToExtent(bounds);
-            if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){ 
-                this.map.zoomTo(lastZoom + (this.out ? -1 : 1)); 
+            if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){
+                this.map.zoomTo(lastZoom + (this.out ? -1 : 1));
             }
         } else { // it's a pixel
             if (!this.out) {
@@ -25671,12 +25671,12 @@
  * Class: OpenLayers.Format.WKT
  * Class for reading and writing Well-Known Text.  Create a new instance
  * with the <OpenLayers.Format.WKT> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.WKT = OpenLayers.Class(OpenLayers.Format, {
-    
+
     /**
      * Constructor: OpenLayers.Format.WKT
      * Create a new parser for WKT
@@ -25723,7 +25723,7 @@
                 features = this.parse[type].apply(this, [str]);
             }
             if (this.internalProjection && this.externalProjection) {
-                if (features && 
+                if (features &&
                     features.CLASS_NAME == "OpenLayers.Feature.Vector") {
                     features.geometry.transform(this.externalProjection,
                                                 this.internalProjection);
@@ -25737,7 +25737,7 @@
                     }
                 }
             }
-        }    
+        }
         return features;
     },
 
@@ -25776,9 +25776,9 @@
             }
             if (this.internalProjection && this.externalProjection) {
                 geometry = geometry.clone();
-                geometry.transform(this.internalProjection, 
+                geometry.transform(this.internalProjection,
                                    this.externalProjection);
-            }                       
+            }
             data = this.extract[type].apply(this, [geometry]);
             pieces.push(type.toUpperCase() + '(' + data + ')');
         }
@@ -25787,7 +25787,7 @@
         }
         return pieces.join('');
     },
-    
+
     /**
      * Object with properties corresponding to the geometry types.
      * Property values are functions that do the actual data extraction.
@@ -25815,7 +25815,7 @@
             }
             return array.join(',');
         },
-        
+
         /**
          * Return a comma delimited string of point coordinates from a line.
          * @param {<OpenLayers.Geometry.LineString>} linestring
@@ -25845,7 +25845,7 @@
             }
             return array.join(',');
         },
-        
+
         /**
          * Return a comma delimited string of linear ring arrays from a polygon.
          * @param {<OpenLayers.Geometry.Polygon>} polygon
@@ -25913,7 +25913,7 @@
                 new OpenLayers.Geometry.MultiPoint(components)
             );
         },
-        
+
         /**
          * Return a linestring feature given a linestring WKT fragment.
          * @param {String} A WKT fragment representing the linestring
@@ -25949,7 +25949,7 @@
                 new OpenLayers.Geometry.MultiLineString(components)
             );
         },
-        
+
         /**
          * Return a polygon feature given a polygon WKT fragment.
          * @param {String} A WKT fragment representing the polygon
@@ -26009,8 +26009,8 @@
 
     },
 
-    CLASS_NAME: "OpenLayers.Format.WKT" 
-});     
+    CLASS_NAME: "OpenLayers.Format.WKT"
+});
 /* ======================================================================
     OpenLayers/Layer/Google.js
    ====================================================================== */
@@ -26029,53 +26029,53 @@
 
 /**
  * Class: OpenLayers.Layer.Google
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.SphericalMercator>
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
  */
 OpenLayers.Layer.Google = OpenLayers.Class(
-    OpenLayers.Layer.EventPane, 
+    OpenLayers.Layer.EventPane,
     OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 0 
+     * {Integer} 0
      */
     MIN_ZOOM_LEVEL: 0,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 19
      */
     MAX_ZOOM_LEVEL: 19,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
         0.00274658203125,
-        0.001373291015625, 
-        0.0006866455078125, 
+        0.001373291015625,
+        0.0006866455078125,
         0.00034332275390625,
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
-        0.00002145767211914062, 
+        0.00002145767211914062,
         0.00001072883605957031,
-        0.00000536441802978515, 
+        0.00000536441802978515,
         0.00000268220901489257
     ],
 
@@ -26088,34 +26088,34 @@
     /**
      * APIProperty: sphericalMercator
      * {Boolean} Should the map act as a mercator-projected map? This will
-     *     cause all interactions with the map to be in the actual map 
-     *     projection, which allows support for vector drawing, overlaying 
-     *     other maps, etc. 
+     *     cause all interactions with the map to be in the actual map
+     *     projection, which allows support for vector drawing, overlaying
+     *     other maps, etc.
      */
-    sphericalMercator: false, 
-    
+    sphericalMercator: false,
+
     /**
      * Property: dragObject
      * {GDraggableObject} Since 2.93, Google has exposed the ability to get
      *     the maps GDraggableObject. We can now use this for smooth panning
      */
-    dragObject: null, 
+    dragObject: null,
 
     /**
      * Property: termsOfUse
      * {DOMElement} Div for Google's copyright and terms of use link
      */
-    termsOfUse: null, 
+    termsOfUse: null,
 
     /**
      * Property: poweredBy
      * {DOMElement} Div for Google's powered by logo and link
      */
-    poweredBy: null, 
+    poweredBy: null,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.Google
-     * 
+     *
      * Parameters:
      * name - {String} A name for the layer.
      * options - {Object} An optional object whose properties will be set
@@ -26123,27 +26123,27 @@
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         this.addContainerPxFunction();
         if (this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
-        }    
+        }
     },
-    
-    /** 
+
+    /**
      * Method: loadMapObject
-     * Load the GMap and register appropriate event listeners. If we can't 
+     * Load the GMap and register appropriate event listeners. If we can't
      *     load GMap2, then display a warning message.
      */
     loadMapObject:function() {
-        
+
         //has gmaps library has been loaded?
         try {
             // create GMap, hide nav controls
             this.mapObject = new GMap2( this.div );
-            
+
             //since v 2.93 getDragObject is now available.
             if(typeof this.mapObject.getDragObject == "function") {
                 this.dragObject = this.mapObject.getDragObject();
@@ -26176,21 +26176,21 @@
             this.poweredBy.style.display = this.div.style.display;
             this.poweredBy.style.right = "";
             this.poweredBy.style.bottom = "";
-            this.poweredBy.className = "olLayerGooglePoweredBy gmnoprint"; 
+            this.poweredBy.className = "olLayerGooglePoweredBy gmnoprint";
 
         } catch (e) {
             OpenLayers.Console.error(e);
         }
-               
+
     },
 
-    /** 
+    /**
      * APIMethod: setMap
-     * Overridden from EventPane because if a map type has been specified, 
-     *     we need to attach a listener for the first moveend -- this is how 
-     *     we will know that the map has been centered. Only once the map has 
-     *     been centered is it safe to change the gmap object's map type. 
-     * 
+     * Overridden from EventPane because if a map type has been specified,
+     *     we need to attach a listener for the first moveend -- this is how
+     *     we will know that the map has been centered. Only once the map has
+     *     been centered is it safe to change the gmap object's map type.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -26201,21 +26201,21 @@
             this.map.events.register("moveend", this, this.setMapType);
         }
     },
-    
-    /** 
+
+    /**
      * Method: setMapType
-     * The map has been centered, and a map type was specified, so we 
+     * The map has been centered, and a map type was specified, so we
      *     set the map type on the gmap object, then unregister the listener
      *     so that we dont keep doing this every time the map moves.
      */
     setMapType: function() {
         if (this.mapObject.getCenter() != null) {
-            
+
             // Support for custom map types.
             if (OpenLayers.Util.indexOf(this.mapObject.getMapTypes(),
                                         this.type) == -1) {
                 this.mapObject.addMapType(this.type);
-            }    
+            }
 
             this.mapObject.setMapType(this.type);
             this.map.events.unregister("moveend", this, this.setMapType);
@@ -26224,7 +26224,7 @@
 
     /**
      * APIMethod: onMapResize
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
@@ -26266,7 +26266,7 @@
     /**
      * APIMethod: removeMap
      * On being removed from the map, also remove termsOfUse and poweredBy divs
-     * 
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -26281,15 +26281,15 @@
         }
         OpenLayers.Layer.EventPane.prototype.removeMap.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: getZoomForExtent
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     *  
+     *
      * Returns:
-     * {Integer} Corresponding zoom level for a specified Bounds. 
+     * {Integer} Corresponding zoom level for a specified Bounds.
      *           If mapObject is not loaded or not centered, returns null
      *
     getZoomForExtent: function (bounds) {
@@ -26298,29 +26298,29 @@
             var moBounds = this.getMapObjectBoundsFromOLBounds(bounds);
             var moZoom = this.getMapObjectZoomFromMapObjectBounds(moBounds);
 
-            //make sure zoom is within bounds    
-            var moZoom = Math.min(Math.max(moZoom, this.minZoomLevel), 
+            //make sure zoom is within bounds
+            var moZoom = Math.min(Math.max(moZoom, this.minZoomLevel),
                                  this.maxZoomLevel);
 
             zoom = this.getOLZoomFromMapObjectZoom(moZoom);
         }
         return zoom;
     },
-    
+
     */
-    
+
   //
   // TRANSLATION: MapObject Bounds <-> OpenLayers.Bounds
   //
 
     /**
      * APIMethod: getOLBoundsFromMapObjectBounds
-     * 
+     *
      * Parameters:
      * moBounds - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} An <OpenLayers.Bounds>, translated from the 
+     * {<OpenLayers.Bounds>} An <OpenLayers.Bounds>, translated from the
      *                       passed-in MapObject Bounds.
      *                       Returns null if null value is passed in.
      */
@@ -26333,12 +26333,12 @@
                 sw = this.forwardMercator(sw.lng(), sw.lat());
                 ne = this.forwardMercator(ne.lng(), ne.lat());
             } else {
-                sw = new OpenLayers.LonLat(sw.lng(), sw.lat()); 
-                ne = new OpenLayers.LonLat(ne.lng(), ne.lat()); 
-            }    
-            olBounds = new OpenLayers.Bounds(sw.lon, 
-                                             sw.lat, 
-                                             ne.lon, 
+                sw = new OpenLayers.LonLat(sw.lng(), sw.lat());
+                ne = new OpenLayers.LonLat(ne.lng(), ne.lat());
+            }
+            olBounds = new OpenLayers.Bounds(sw.lon,
+                                             sw.lat,
+                                             ne.lon,
                                              ne.lat );
         }
         return olBounds;
@@ -26346,10 +26346,10 @@
 
     /**
      * APIMethod: getMapObjectBoundsFromOLBounds
-     * 
+     *
      * Parameters:
      * olBounds - {<OpenLayers.Bounds>}
-     * 
+     *
      * Returns:
      * {Object} A MapObject Bounds, translated from olBounds
      *          Returns null if null value is passed in
@@ -26357,11 +26357,11 @@
     getMapObjectBoundsFromOLBounds: function(olBounds) {
         var moBounds = null;
         if (olBounds != null) {
-            var sw = this.sphericalMercator ? 
-              this.inverseMercator(olBounds.bottom, olBounds.left) : 
+            var sw = this.sphericalMercator ?
+              this.inverseMercator(olBounds.bottom, olBounds.left) :
               new OpenLayers.LonLat(olBounds.bottom, olBounds.left);
-            var ne = this.sphericalMercator ? 
-              this.inverseMercator(olBounds.top, olBounds.right) : 
+            var ne = this.sphericalMercator ?
+              this.inverseMercator(olBounds.top, olBounds.right) :
               new OpenLayers.LonLat(olBounds.top, olBounds.right);
             moBounds = new GLatLngBounds(new GLatLng(sw.lat, sw.lon),
                                          new GLatLng(ne.lat, ne.lon));
@@ -26369,41 +26369,41 @@
         return moBounds;
     },
 
-    /** 
+    /**
      * Method: addContainerPxFunction
      * Hack-on function because GMAPS does not give it to us
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * gLatLng - {GLatLng}
-     * 
+     *
      * Returns:
      * {GPoint} A GPoint specifying gLatLng translated into "Container" coords
      */
     addContainerPxFunction: function() {
-        if ( (typeof GMap2 != "undefined") && 
+        if ( (typeof GMap2 != "undefined") &&
              !GMap2.prototype.fromLatLngToContainerPixel) {
-          
+
             GMap2.prototype.fromLatLngToContainerPixel = function(gLatLng) {
-          
+
                 // first we translate into "DivPixel"
                 var gPoint = this.fromLatLngToDivPixel(gLatLng);
-      
+
                 // locate the sliding "Div" div
                 var div = this.getContainer().firstChild.firstChild;
-  
+
                 // adjust by the offset of "Div" and voila!
                 gPoint.x += div.offsetLeft;
                 gPoint.y += div.offsetTop;
-    
+
                 return gPoint;
             };
         }
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -26421,21 +26421,21 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.setCenter(center, zoom); 
+        this.mapObject.setCenter(center, zoom);
     },
-   
+
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -26446,17 +26446,17 @@
 
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
         return this.mapObject.getCenter();
     },
 
-    /** 
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -26466,13 +26466,13 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
@@ -26482,10 +26482,10 @@
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -26493,15 +26493,15 @@
         return this.mapObject.fromLatLngToContainerPixel(moLonLat);
     },
 
-  
+
   // Bounds
-  
-    /** 
+
+    /**
      * APIMethod: getMapObjectZoomFromMapObjectBounds
-     * 
+     *
      * Parameters:
      * moBounds - {Object} MapObject Bounds format
-     * 
+     *
      * Returns:
      * {Object} MapObject Zoom for specified MapObject Bounds
      */
@@ -26517,45 +26517,45 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
           this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lon :
-          moLonLat.lng();  
+          moLonLat.lng();
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        var lat = this.sphericalMercator ? 
+        var lat = this.sphericalMercator ?
           this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lat :
-          moLonLat.lat(); 
-        return lat;  
+          moLonLat.lat();
+        return lat;
     },
-    
+
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -26571,13 +26571,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -26587,10 +26587,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -26600,11 +26600,11 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
@@ -26637,38 +26637,38 @@
  *  - <OpenLayers.Layer.HTTPRequest>
  */
 OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
-    
+
     /**
      * APIProperty: tileSize
      * {<OpenLayers.Size>}
      */
     tileSize: null,
-    
+
     /**
      * Property: grid
-     * {Array(Array(<OpenLayers.Tile>))} This is an array of rows, each row is 
+     * {Array(Array(<OpenLayers.Tile>))} This is an array of rows, each row is
      *     an array of tiles.
      */
     grid: null,
 
     /**
      * APIProperty: singleTile
-     * {Boolean} Moves the layer into single-tile mode, meaning that one tile 
+     * {Boolean} Moves the layer into single-tile mode, meaning that one tile
      *     will be loaded. The tile's size will be determined by the 'ratio'
-     *     property. When the tile is dragged such that it does not cover the 
+     *     property. When the tile is dragged such that it does not cover the
      *     entire viewport, it is reloaded.
      */
     singleTile: false,
 
     /** APIProperty: ratio
-     *  {Float} Used only when in single-tile mode, this specifies the 
+     *  {Float} Used only when in single-tile mode, this specifies the
      *          ratio of the size of the single tile to the size of the map.
      */
     ratio: 1.5,
 
     /**
      * APIProperty: buffer
-     * {Integer} Used only when in gridded mode, this specifies the number of 
+     * {Integer} Used only when in gridded mode, this specifies the number of
      *           extra rows and colums of tiles on each side which will
      *           surround the minimum grid tiles to cover the map.
      */
@@ -26691,10 +26691,10 @@
      * options - {Object} Hashtable of extra options to tag onto the layer
      */
     initialize: function(name, url, params, options) {
-        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, 
+        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,
                                                                 arguments);
-        
-        //grid layers will trigger 'tileloaded' when each new tile is 
+
+        //grid layers will trigger 'tileloaded' when each new tile is
         // loaded, as a means of progress update to listeners.
         // listeners can access 'numLoadingTiles' if they wish to keep track
         // of the loading progress
@@ -26712,7 +26712,7 @@
         this.clearGrid();
         this.grid = null;
         this.tileSize = null;
-        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);
     },
 
     /**
@@ -26740,12 +26740,12 @@
      *
      * Parameters:
      * obj - {Object} Is this ever used?
-     * 
+     *
      * Returns:
      * {<OpenLayers.Layer.Grid>} An exact clone of this OpenLayers.Layer.Grid
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.Grid(this.name,
                                             this.url,
@@ -26760,12 +26760,12 @@
         if (this.tileSize != null) {
             obj.tileSize = this.tileSize.clone();
         }
-        
+
         // we do not want to copy reference to grid, so we make a new array
         obj.grid = [];
 
         return obj;
-    },    
+    },
 
     /**
      * Method: moveTo
@@ -26780,32 +26780,32 @@
      */
     moveTo:function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);
-        
+
         bounds = bounds || this.map.getExtent();
 
         if (bounds != null) {
-             
+
             // if grid is empty or zoom has changed, we *must* re-tile
             var forceReTile = !this.grid.length || zoomChanged;
 
             // total bounds of the tiles
-            var tilesBounds = this.getTilesBounds();            
-      
+            var tilesBounds = this.getTilesBounds();
+
             if (this.singleTile) {
-                
-                // We want to redraw whenever even the slightest part of the 
+
+                // We want to redraw whenever even the slightest part of the
                 //  current bounds is not contained by our tile.
                 //  (thus, we do not specify partial -- its default is false)
-                if ( forceReTile || 
+                if ( forceReTile ||
                      (!dragging && !tilesBounds.containsBounds(bounds))) {
                     this.initSingleTile(bounds);
                 }
             } else {
-             
-                // if the bounds have changed such that they are not even 
-                //  *partially* contained by our tiles (IE user has 
-                //  programmatically panned to the other side of the earth) 
-                //  then we want to reTile (thus, partial true).  
+
+                // if the bounds have changed such that they are not even
+                //  *partially* contained by our tiles (IE user has
+                //  programmatically panned to the other side of the earth)
+                //  then we want to reTile (thus, partial true).
                 //
                 if (forceReTile || !tilesBounds.containsBounds(bounds, true)) {
                     this.initGriddedTiles(bounds);
@@ -26816,32 +26816,32 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: setTileSize
      * Check if we are in singleTile mode and if so, set the size as a ratio
      *     of the map size (as specified by the layer's 'ratio' property).
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>}
      */
-    setTileSize: function(size) { 
+    setTileSize: function(size) {
         if (this.singleTile) {
             size = this.map.getSize().clone();
             size.h = parseInt(size.h * this.ratio);
             size.w = parseInt(size.w * this.ratio);
-        } 
+        }
         OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this, [size]);
     },
-        
+
     /**
      * Method: getGridBounds
-     * Deprecated. This function will be removed in 3.0. Please use 
+     * Deprecated. This function will be removed in 3.0. Please use
      *     getTilesBounds() instead.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
-     * currently loaded tiles (including those partially or not at all seen 
+     * currently loaded tiles (including those partially or not at all seen
      * onscreen)
      */
     getGridBounds: function() {
@@ -26857,32 +26857,32 @@
      *
      * Returns:
      * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
-     *     currently loaded tiles (including those partially or not at all seen 
+     *     currently loaded tiles (including those partially or not at all seen
      *     onscreen).
      */
-    getTilesBounds: function() {    
-        var bounds = null; 
-        
+    getTilesBounds: function() {
+        var bounds = null;
+
         if (this.grid.length) {
             var bottom = this.grid.length - 1;
             var bottomLeftTile = this.grid[bottom][0];
-    
-            var right = this.grid[0].length - 1; 
+
+            var right = this.grid[0].length - 1;
             var topRightTile = this.grid[0][right];
-    
-            bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left, 
+
+            bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left,
                                            bottomLeftTile.bounds.bottom,
-                                           topRightTile.bounds.right, 
+                                           topRightTile.bounds.right,
                                            topRightTile.bounds.top);
-            
-        }   
+
+        }
         return bounds;
     },
 
     /**
      * Method: initSingleTile
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     initSingleTile: function(bounds) {
@@ -26891,13 +26891,13 @@
         var center = bounds.getCenterLonLat();
         var tileWidth = bounds.getWidth() * this.ratio;
         var tileHeight = bounds.getHeight() * this.ratio;
-                                       
-        var tileBounds = 
+
+        var tileBounds =
             new OpenLayers.Bounds(center.lon - (tileWidth/2),
                                   center.lat - (tileHeight/2),
                                   center.lon + (tileWidth/2),
                                   center.lat + (tileHeight/2));
-  
+
         var ul = new OpenLayers.LonLat(tileBounds.left, tileBounds.top);
         var px = this.map.getLayerPxFromLonLat(ul);
 
@@ -26908,21 +26908,21 @@
         var tile = this.grid[0][0];
         if (!tile) {
             tile = this.addTile(tileBounds, px);
-            
+
             this.addTileMonitoringHooks(tile);
             tile.draw();
             this.grid[0][0] = tile;
         } else {
             tile.moveTo(tileBounds, px);
-        }           
-        
+        }
+
         //remove all but our single tile
         this.removeExcessTiles(1,1);
     },
 
-    /** 
+    /**
      * Method: calculateGridLayout
-     * Generate parameters for the grid layout. This  
+     * Generate parameters for the grid layout. This
      *
      * Parameters:
      * bounds - {<OpenLayers.Bound>}
@@ -26936,20 +26936,20 @@
     calculateGridLayout: function(bounds, extent, resolution) {
         var tilelon = resolution * this.tileSize.w;
         var tilelat = resolution * this.tileSize.h;
-        
+
         var offsetlon = bounds.left - extent.left;
         var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
         var tilecolremain = offsetlon/tilelon - tilecol;
         var tileoffsetx = -tilecolremain * this.tileSize.w;
         var tileoffsetlon = extent.left + tilecol * tilelon;
-        
-        var offsetlat = bounds.top - (extent.bottom + tilelat);  
+
+        var offsetlat = bounds.top - (extent.bottom + tilelat);
         var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer;
         var tilerowremain = tilerow - offsetlat/tilelat;
         var tileoffsety = -tilerowremain * this.tileSize.h;
         var tileoffsetlat = extent.bottom + tilerow * tilelat;
-        
-        return { 
+
+        return {
           tilelon: tilelon, tilelat: tilelat,
           tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
           tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
@@ -26959,24 +26959,24 @@
 
     /**
      * Method: initGriddedTiles
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     initGriddedTiles:function(bounds) {
-        
+
         // work out mininum number of rows and columns; this is the number of
         // tiles required to cover the viewport plus at least one for panning
 
         var viewSize = this.map.getSize();
-        var minRows = Math.ceil(viewSize.h/this.tileSize.h) + 
+        var minRows = Math.ceil(viewSize.h/this.tileSize.h) +
                       Math.max(1, 2 * this.buffer);
         var minCols = Math.ceil(viewSize.w/this.tileSize.w) +
                       Math.max(1, 2 * this.buffer);
-        
+
         var extent = this.maxExtent;
         var resolution = this.map.getResolution();
-        
+
         var tileLayout = this.calculateGridLayout(bounds, extent, resolution);
 
         var tileoffsetx = Math.round(tileLayout.tileoffsetx); // heaven help us
@@ -26984,21 +26984,21 @@
 
         var tileoffsetlon = tileLayout.tileoffsetlon;
         var tileoffsetlat = tileLayout.tileoffsetlat;
-        
+
         var tilelon = tileLayout.tilelon;
         var tilelat = tileLayout.tilelat;
 
         this.origin = new OpenLayers.Pixel(tileoffsetx, tileoffsety);
 
-        var startX = tileoffsetx; 
+        var startX = tileoffsetx;
         var startLon = tileoffsetlon;
 
         var rowidx = 0;
-        
+
         var layerContainerDivLeft = parseInt(this.map.layerContainerDiv.style.left);
         var layerContainerDivTop = parseInt(this.map.layerContainerDiv.style.top);
-        
-    
+
+
         do {
             var row = this.grid[rowidx++];
             if (!row) {
@@ -27009,11 +27009,11 @@
             tileoffsetlon = startLon;
             tileoffsetx = startX;
             var colidx = 0;
- 
+
             do {
-                var tileBounds = 
-                    new OpenLayers.Bounds(tileoffsetlon, 
-                                          tileoffsetlat, 
+                var tileBounds =
+                    new OpenLayers.Bounds(tileoffsetlon,
+                                          tileoffsetlat,
                                           tileoffsetlon + tilelon,
                                           tileoffsetlat + tilelat);
 
@@ -27032,44 +27032,44 @@
                 } else {
                     tile.moveTo(tileBounds, px, false);
                 }
-     
-                tileoffsetlon += tilelon;       
+
+                tileoffsetlon += tilelon;
                 tileoffsetx += this.tileSize.w;
             } while ((tileoffsetlon <= bounds.right + tilelon * this.buffer)
                      || colidx < minCols);
-             
+
             tileoffsetlat -= tilelat;
             tileoffsety += this.tileSize.h;
         } while((tileoffsetlat >= bounds.bottom - tilelat * this.buffer)
                 || rowidx < minRows);
-        
+
         //shave off exceess rows and colums
         this.removeExcessTiles(rowidx, colidx);
 
         //now actually draw the tiles
         this.spiralTileLoad();
     },
-    
+
     /**
      * Method: spiralTileLoad
-     *   Starts at the top right corner of the grid and proceeds in a spiral 
-     *    towards the center, adding tiles one at a time to the beginning of a 
-     *    queue. 
-     * 
-     *   Once all the grid's tiles have been added to the queue, we go back 
-     *    and iterate through the queue (thus reversing the spiral order from 
-     *    outside-in to inside-out), calling draw() on each tile. 
+     *   Starts at the top right corner of the grid and proceeds in a spiral
+     *    towards the center, adding tiles one at a time to the beginning of a
+     *    queue.
+     *
+     *   Once all the grid's tiles have been added to the queue, we go back
+     *    and iterate through the queue (thus reversing the spiral order from
+     *    outside-in to inside-out), calling draw() on each tile.
      */
     spiralTileLoad: function() {
         var tileQueue = [];
- 
+
         var directions = ["right", "down", "left", "up"];
 
         var iRow = 0;
         var iCell = -1;
         var direction = OpenLayers.Util.indexOf(directions, "right");
         var directionsTried = 0;
-        
+
         while( directionsTried < directions.length) {
 
             var testRow = iRow;
@@ -27088,21 +27088,21 @@
                 case "up":
                     testRow--;
                     break;
-            } 
-    
-            // if the test grid coordinates are within the bounds of the 
+            }
+
+            // if the test grid coordinates are within the bounds of the
             //  grid, get a reference to the tile.
             var tile = null;
             if ((testRow < this.grid.length) && (testRow >= 0) &&
                 (testCell < this.grid[0].length) && (testCell >= 0)) {
                 tile = this.grid[testRow][testCell];
             }
-            
+
             if ((tile != null) && (!tile.queued)) {
                 //add tile to beginning of queue, mark it as queued.
                 tileQueue.unshift(tile);
                 tile.queued = true;
-                
+
                 //restart the directions counter and take on the new coords
                 directionsTried = 0;
                 iRow = testRow;
@@ -27112,21 +27112,21 @@
                 direction = (direction + 1) % 4;
                 directionsTried++;
             }
-        } 
-        
+        }
+
         // now we go through and draw the tiles in forward order
         for(var i=0, len=tileQueue.length; i<len; i++) {
             var tile = tileQueue[i];
             tile.draw();
             //mark tile as unqueued for the next time (since tiles are reused)
-            tile.queued = false;       
+            tile.queued = false;
         }
     },
 
     /**
      * APIMethod: addTile
-     * Gives subclasses of Grid the opportunity to create an 
-     * OpenLayer.Tile of their choosing. The implementer should initialize 
+     * Gives subclasses of Grid the opportunity to create an
+     * OpenLayer.Tile of their choosing. The implementer should initialize
      * the new tile and take whatever steps necessary to display it.
      *
      * Parameters
@@ -27139,17 +27139,17 @@
     addTile:function(bounds, position) {
         // Should be implemented by subclasses
     },
-    
-    /** 
+
+    /**
      * Method: addTileMonitoringHooks
-     * This function takes a tile as input and adds the appropriate hooks to 
+     * This function takes a tile as input and adds the appropriate hooks to
      *     the tile so that the layer can keep track of the loading tiles.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * tile - {<OpenLayers.Tile>}
      */
     addTileMonitoringHooks: function(tile) {
-        
+
         tile.onLoadStart = function() {
             //if that was first tile then trigger a 'loadstart' on the layer
             if (this.numLoadingTiles == 0) {
@@ -27158,7 +27158,7 @@
             this.numLoadingTiles++;
         };
         tile.events.register("loadstart", this, tile.onLoadStart);
-      
+
         tile.onLoadEnd = function() {
             this.numLoadingTiles--;
             this.events.triggerEvent("tileloaded");
@@ -27171,12 +27171,12 @@
         tile.events.register("unload", this, tile.onLoadEnd);
     },
 
-    /** 
+    /**
      * Method: removeTileMonitoringHooks
-     * This function takes a tile as input and removes the tile hooks 
+     * This function takes a tile as input and removes the tile hooks
      *     that were added in addTileMonitoringHooks()
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * tile - {<OpenLayers.Tile>}
      */
     removeTileMonitoringHooks: function(tile) {
@@ -27188,10 +27188,10 @@
             scope: this
         });
     },
-    
+
     /**
      * Method: moveGriddedTiles
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
@@ -27199,7 +27199,7 @@
         var buffer = this.buffer || 1;
         while (true) {
             var tlLayer = this.grid[0][0].position;
-            var tlViewPort = 
+            var tlViewPort =
                 this.map.getViewPortPxFromLayerPx(tlLayer);
             if (tlViewPort.x > -this.tileSize.w * (buffer - 1)) {
                 this.shiftColumn(true);
@@ -27268,7 +27268,7 @@
             var row = this.grid[i];
             var modelTileIndex = (prepend) ? 0 : (row.length - 1);
             var modelTile = row[modelTileIndex];
-            
+
             var bounds = modelTile.bounds.clone();
             var position = modelTile.position.clone();
             bounds.left = bounds.left + deltaLon;
@@ -27284,18 +27284,18 @@
             }
         }
     },
-    
+
     /**
      * Method: removeExcessTiles
      * When the size of the map or the buffer changes, we may need to
      *     remove some excess rows and columns.
-     * 
+     *
      * Parameters:
      * rows - {Integer} Maximum number of rows we want our grid to have.
      * colums - {Integer} Maximum number of columns we want our grid to have.
      */
     removeExcessTiles: function(rows, columns) {
-        
+
         // remove extra rows
         while (this.grid.length > rows) {
             var row = this.grid.pop();
@@ -27305,7 +27305,7 @@
                 tile.destroy();
             }
         }
-        
+
         // remove extra columns
         while (this.grid[0].length > columns) {
             for (var i=0, l=this.grid.length; i<l; i++) {
@@ -27328,7 +27328,7 @@
             this.setTileSize();
         }
     },
-    
+
     /**
      * APIMethod: getTileBounds
      * Returns The tile bounds for a layer given a pixel location.
@@ -27357,7 +27357,7 @@
                                      tileLeft + tileMapWidth,
                                      tileBottom + tileMapHeight);
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.Grid"
 });
 /* ======================================================================
@@ -27376,7 +27376,7 @@
 
 /**
  * Class: OpenLayers.Layer.VirtualEarth
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
@@ -27384,40 +27384,40 @@
 OpenLayers.Layer.VirtualEarth = OpenLayers.Class(
     OpenLayers.Layer.EventPane,
     OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 1 
+     * {Integer} 1
      */
     MIN_ZOOM_LEVEL: 1,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 17
      */
     MAX_ZOOM_LEVEL: 17,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
         0.00274658203125,
-        0.001373291015625, 
-        0.0006866455078125, 
-        0.00034332275390625, 
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.001373291015625,
+        0.0006866455078125,
+        0.00034332275390625,
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
         0.00002145767211914062
     ],
@@ -27433,9 +27433,9 @@
      * {Boolean} Should the map act as a mercator-projected map? This will
      *     cause all interactions with the map to be in the actual map
      *     projection, which allows support for vector drawing, overlaying
-     *     other maps, etc. 
+     *     other maps, etc.
      */
-    sphericalMercator: false, 
+    sphericalMercator: false,
 
     /**
      * APIProperty: animationEnabled
@@ -27443,25 +27443,25 @@
      *     animated. Set to false to match the zooming experience of other
      *     layer types. Default is true.
      */
-    animationEnabled: true, 
+    animationEnabled: true,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.VirtualEarth
-     * 
+     *
      * Parameters:
      * name - {String}
      * options - {Object}
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         if(this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
         }
     },
-    
+
     /**
      * Method: loadMapObject
      */
@@ -27481,21 +27481,23 @@
         if (this.mapObject != null) {
             try { // this is to catch a Mozilla bug without falling apart
 
-                // The fourth argument is whether the map is 'fixed' -- not 
-                // draggable. See: 
+                // The fourth argument is whether the map is 'fixed' -- not
+                // draggable. See:
                 // http://blogs.msdn.com/virtualearth/archive/2007/09/28/locking-a-virtual-earth-map.aspx
                 //
                 this.mapObject.LoadMap(null, null, this.type, true);
                 this.mapObject.AttachEvent("onmousedown", function() {return true; });
 
             } catch (e) { }
+            this.mapObject.AttachEvent("onresize",
+                OpenLayers.Function.bindAsEventListener(this.redrawDependentLayers, this));
             this.mapObject.HideDashboard();
             if(typeof this.mapObject.SetAnimationEnabled == "function") {
                 this.mapObject.SetAnimationEnabled(this.animationEnabled);
             }
         }
 
-        //can we do smooth panning? this is an unpublished method, so we need 
+        //can we do smooth panning? this is an unpublished method, so we need
         // to be careful
         if ( !this.mapObject ||
              !this.mapObject.vemapcontrol ||
@@ -27506,18 +27508,36 @@
         }
 
     },
-    
+
     /**
+     * Method: redrawDependentLayers
+     */
+    redrawDependentLayers: function(event) {
+        if(this.isBaseLayer)
+        {
+            for(var i=0, len=this.map.layers.length; i<len; i++)
+            {
+                var otherLayer = this.map.layers[i];
+                if(otherLayer != this)
+                {
+                    otherLayer.redraw();
+                }
+            }
+        }
+    },
+
+
+    /**
      * Method: onMapResize
      */
     onMapResize: function() {
         this.mapObject.Resize(this.map.size.w, this.map.size.h);
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -27538,22 +27558,22 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.SetCenterAndZoom(center, zoom); 
+        this.mapObject.SetCenterAndZoom(center, zoom);
     },
-   
+
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
@@ -27562,7 +27582,7 @@
 
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -27571,9 +27591,9 @@
         this.mapObject.vemapcontrol.PanMap(dX, -dY);
     },
 
-    /** 
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -27583,29 +27603,29 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
     getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
         //the conditional here is to test if we are running the v6 of VE
-        return (typeof VEPixel != 'undefined') 
+        return (typeof VEPixel != 'undefined')
             ? this.mapObject.PixelToLatLong(moPixel)
             : this.mapObject.PixelToLatLong(moPixel.x, moPixel.y);
     },
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -27622,44 +27642,44 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lon :
             moLonLat.Longitude;
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lat :
             moLonLat.Latitude;
     },
 
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -27675,13 +27695,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -27691,10 +27711,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -27704,11 +27724,11 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
@@ -27736,47 +27756,47 @@
 
 /**
  * Class: OpenLayers.Layer.Yahoo
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
  */
 OpenLayers.Layer.Yahoo = OpenLayers.Class(
   OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 0 
+     * {Integer} 0
      */
     MIN_ZOOM_LEVEL: 0,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 17
      */
     MAX_ZOOM_LEVEL: 17,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
-        0.00274658203125, 
-        0.001373291015625, 
-        0.0006866455078125, 
-        0.00034332275390625, 
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
+        0.00274658203125,
+        0.001373291015625,
+        0.0006866455078125,
+        0.00034332275390625,
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
         0.00002145767211914062,
         0.00001072883605957031
@@ -27787,69 +27807,69 @@
      * {YahooMapType}
      */
     type: null,
-    
+
     /**
      * APIProperty: sphericalMercator
      * {Boolean} Should the map act as a mercator-projected map? This will
      * cause all interactions with the map to be in the actual map projection,
-     * which allows support for vector drawing, overlaying other maps, etc. 
+     * which allows support for vector drawing, overlaying other maps, etc.
      */
-    sphericalMercator: false, 
+    sphericalMercator: false,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.Yahoo
-     * 
+     *
      * Parameters:
      * name - {String}
      * options - {Object}
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         if(this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
         }
     },
-    
+
     /**
      * Method: loadMapObject
      */
     loadMapObject:function() {
-        try { //do not crash! 
+        try { //do not crash!
             var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
             this.mapObject = new YMap(this.div, this.type, size);
             this.mapObject.disableKeyControls();
             this.mapObject.disableDragMap();
 
             //can we do smooth panning? (moveByXY is not an API function)
-            if ( !this.mapObject.moveByXY || 
+            if ( !this.mapObject.moveByXY ||
                  (typeof this.mapObject.moveByXY != "function" ) ) {
 
                 this.dragPanMapObject = null;
-            }                
+            }
         } catch(e) {}
     },
 
     /**
      * Method: onMapResize
-     * 
+     *
      */
     onMapResize: function() {
         try {
             var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
             this.mapObject.resizeTo(size);
-        } catch(e) {}     
-    },    
-    
-    
-    /** 
+        } catch(e) {}
+    },
+
+
+    /**
      * APIMethod: setMap
      * Overridden from EventPane because we need to remove this yahoo event
-     *     pane which prohibits our drag and drop, and we can only do this 
+     *     pane which prohibits our drag and drop, and we can only do this
      *     once the map has been loaded and centered.
-     * 
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -27859,7 +27879,7 @@
         this.map.events.register("moveend", this, this.fixYahooEventPane);
     },
 
-    /** 
+    /**
      * Method: fixYahooEventPane
      * The map has been centered, so the mysterious yahoo eventpane has been
      *     added. we remove it so that it doesnt mess with *our* event pane.
@@ -27870,15 +27890,15 @@
             if (yahooEventPane.parentNode != null) {
                 yahooEventPane.parentNode.removeChild(yahooEventPane);
             }
-            this.map.events.unregister("moveend", this, 
+            this.map.events.unregister("moveend", this,
                                        this.fixYahooEventPane);
         }
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -27892,7 +27912,7 @@
   /*                                                      */
   /*             Translation Functions                    */
   /*                                                      */
-  /*    The following functions translate GMaps and OL    */ 
+  /*    The following functions translate GMaps and OL    */
   /*     formats for Pixel, LonLat, Bounds, and Zoom      */
   /*                                                      */
   /********************************************************/
@@ -27901,13 +27921,13 @@
   //
   // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
   //
-  
+
     /**
      * APIMethod: getOLZoomFromMapObjectZoom
-     * 
+     *
      * Parameters:
      * gZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} An OpenLayers Zoom level, translated from the passed in gZoom
      *           Returns null if null value is passed in.
@@ -27920,19 +27940,19 @@
         }
         return zoom;
     },
-    
+
     /**
      * APIMethod: getMapObjectZoomFromOLZoom
-     * 
+     *
      * Parameters:
      * olZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} A MapObject level, translated from the passed in olZoom
      *           Returns null if null value is passed in
      */
     getMapObjectZoomFromOLZoom: function(olZoom) {
-        var zoom = null; 
+        var zoom = null;
         if (olZoom != null) {
             zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this, [olZoom]);
             zoom = 18 - zoom;
@@ -27949,22 +27969,22 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.drawZoomAndCenter(center, zoom); 
+        this.mapObject.drawZoomAndCenter(center, zoom);
     },
-   
+
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
@@ -27973,7 +27993,7 @@
 
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -27984,10 +28004,10 @@
             'y': dY
         });
     },
-    
-    /** 
+
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -27997,13 +28017,13 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
@@ -28013,10 +28033,10 @@
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -28033,44 +28053,44 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lon :
             moLonLat.Lon;
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lat :
             moLonLat.Lat;
     },
 
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -28086,13 +28106,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -28102,10 +28122,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -28115,33 +28135,33 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
     getMapObjectPixelFromXY: function(x, y) {
         return new YCoordPoint(x, y);
     },
-    
+
   // Size
-  
+
     /**
      * APIMethod: getMapObjectSizeFromOLSize
-     * 
+     *
      * Parameters:
      * olSize - {<OpenLayers.Size>}
-     * 
+     *
      * Returns:
      * {Object} MapObject Size from olSize parameter
      */
     getMapObjectSizeFromOLSize: function(olSize) {
         return new YSize(olSize.w, olSize.h);
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.Yahoo"
 });
 /* ======================================================================
@@ -28189,7 +28209,7 @@
      *     Example: {'bbox': '5,5,5,5'}
      */
     params: null,
-    
+
     /**
      * Property: callback
      * {Object} Function to be called when the <read>, <create>,
@@ -28222,7 +28242,7 @@
      *
      * Valid options include:
      * url - {String}
-     * headers - {Object} 
+     * headers - {Object}
      * params - {Object}
      * format - {<OpenLayers.Format>}
      * callback - {Function}
@@ -28233,7 +28253,7 @@
         this.headers = {};
         OpenLayers.Protocol.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up the protocol.
@@ -28243,7 +28263,7 @@
         this.headers = null;
         OpenLayers.Protocol.prototype.destroy.apply(this);
     },
-   
+
     /**
      * Method: createCallback
      * Returns a function that applies the given public method with resp and
@@ -28333,7 +28353,7 @@
     handleRead: function(resp, options) {
         this.handleResponse(resp, options);
     },
-    
+
     /**
      * APIMethod: create
      * Construct a request for writing newly created features.
@@ -28346,7 +28366,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes, its "features" property is then populated with the
      *     the features received from the server.
@@ -28394,7 +28414,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes, its "features" property is then populated with the
      *     the feature received from the server.
@@ -28443,7 +28463,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes.
      */
@@ -28554,7 +28574,7 @@
     commit: function(features, options) {
         options = OpenLayers.Util.applyDefaults(options, this.options);
         var resp = [], nResponses = 0;
-        
+
         // Divide up features before issuing any requests.  This properly
         // counts requests in the event that any responses come in before
         // all requests have been issued.
@@ -28568,42 +28588,42 @@
             list = types[feature.state];
             if(list) {
                 list.push(feature);
-                requestFeatures.push(feature); 
+                requestFeatures.push(feature);
             }
         }
         // tally up number of requests
         var nRequests = (types[OpenLayers.State.INSERT].length > 0 ? 1 : 0) +
             types[OpenLayers.State.UPDATE].length +
             types[OpenLayers.State.DELETE].length;
-        
+
         // This response will be sent to the final callback after all the others
         // have been fired.
         var success = true;
         var finalResponse = new OpenLayers.Protocol.Response({
-            reqFeatures: requestFeatures        
+            reqFeatures: requestFeatures
         });
-        
+
         function insertCallback(response) {
             var len = response.features ? response.features.length : 0;
             var fids = new Array(len);
             for(var i=0; i<len; ++i) {
                 fids[i] = response.features[i].fid;
-            }   
+            }
             finalResponse.insertIds = fids;
             callback.apply(this, [response]);
         }
- 
+
         function callback(response) {
             this.callUserCallback(response, options);
             success = success && response.success();
             nResponses++;
             if (nResponses >= nRequests) {
                 if (options.callback) {
-                    finalResponse.code = success ? 
+                    finalResponse.code = success ?
                         OpenLayers.Protocol.Response.SUCCESS :
                         OpenLayers.Protocol.Response.FAILURE;
                     options.callback.apply(options.scope, [finalResponse]);
-                }    
+                }
             }
         }
 
@@ -28667,7 +28687,7 @@
         }
     },
 
-    CLASS_NAME: "OpenLayers.Protocol.HTTP" 
+    CLASS_NAME: "OpenLayers.Protocol.HTTP"
 });
 /* ======================================================================
     OpenLayers/Style.js
@@ -28695,13 +28715,13 @@
      * {String}
      */
     name: null,
-    
+
     /**
      * Property: title
      * {String} Title of this style (set if included in SLD)
      */
     title: null,
-    
+
     /**
      * Property: description
      * {String} Description of this style (set if abstract is included in SLD)
@@ -28714,19 +28734,19 @@
      * according to the NamedLayer attribute of an SLD document.
      */
     layerName: null,
-    
+
     /**
      * APIProperty: isDefault
      * {Boolean}
      */
     isDefault: false,
-     
-    /** 
-     * Property: rules 
+
+    /**
+     * Property: rules
      * {Array(<OpenLayers.Rule>)}
      */
     rules: null,
-    
+
     /**
      * Property: context
      * {Object} An optional object with properties that symbolizers' property
@@ -28744,7 +28764,7 @@
      * rules defined.
      */
     defaultStyle: null,
-    
+
     /**
      * Property: defaultsPerSymbolizer
      * {Boolean} If set to true, the <defaultStyle> will extend the symbolizer
@@ -28753,16 +28773,16 @@
      * graphic set to true. Default is false.
      */
     defaultsPerSymbolizer: false,
-    
+
     /**
      * Property: propertyStyles
      * {Hash of Boolean} cache of style properties that need to be parsed for
      * propertyNames. Property names are keys, values won't be used.
      */
     propertyStyles: null,
-    
 
-    /** 
+
+    /**
      * Constructor: OpenLayers.Style
      * Creates a UserStyle.
      *
@@ -28777,7 +28797,7 @@
      * Valid options:
      * rules - {Array(<OpenLayers.Rule>)} List of rules to be added to the
      *     style.
-     * 
+     *
      * Return:
      * {<OpenLayers.Style>}
      */
@@ -28796,7 +28816,7 @@
 
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -28808,22 +28828,22 @@
         this.rules = null;
         this.defaultStyle = null;
     },
-    
+
     /**
      * Method: createSymbolizer
      * creates a style by applying all feature-dependent rules to the base
      * style.
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} feature to evaluate rules for
-     * 
+     *
      * Returns:
      * {Object} symbolizer hash
      */
     createSymbolizer: function(feature) {
         var style = this.defaultsPerSymbolizer ? {} : this.createLiterals(
             OpenLayers.Util.extend({}, this.defaultStyle), feature);
-        
+
         var rules = this.rules;
 
         var rule, context;
@@ -28833,7 +28853,7 @@
             rule = rules[i];
             // does the rule apply?
             var applies = rule.evaluate(feature);
-            
+
             if(applies) {
                 if(rule instanceof OpenLayers.Rule && rule.elseFilter) {
                     elseRules.push(rule);
@@ -28843,7 +28863,7 @@
                 }
             }
         }
-        
+
         // if no other rules apply, apply the rules with else filters
         if(appliedRules == false && elseRules.length > 0) {
             appliedRules = true;
@@ -28856,10 +28876,10 @@
         if(rules.length > 0 && appliedRules == false) {
             style.display = "none";
         }
-        
+
         return style;
     },
-    
+
     /**
      * Method: applySymbolizer
      *
@@ -28877,7 +28897,7 @@
                 OpenLayers.Style.SYMBOLIZER_PREFIXES[0];
 
         var symbolizer = rule.symbolizer[symbolizerPrefix] || rule.symbolizer;
-        
+
         if(this.defaultsPerSymbolizer === true) {
             var defaults = this.defaultStyle;
             OpenLayers.Util.applyDefaults(symbolizer, {
@@ -28916,35 +28936,35 @@
         return this.createLiterals(
                 OpenLayers.Util.extend(style, symbolizer), feature);
     },
-    
+
     /**
      * Method: createLiterals
      * creates literals for all style properties that have an entry in
      * <this.propertyStyles>.
-     * 
+     *
      * Parameters:
      * style   - {Object} style to create literals for. Will be modified
      *           inline.
      * feature - {Object}
-     * 
+     *
      * Returns:
      * {Object} the modified style
      */
     createLiterals: function(style, feature) {
         var context = this.context || feature.attributes || feature.data;
-        
+
         for (var i in this.propertyStyles) {
             style[i] = OpenLayers.Style.createLiteral(style[i], context, feature);
         }
         return style;
     },
-    
+
     /**
      * Method: findPropertyStyles
      * Looks into all rules for this style and the defaultStyle to collect
      * all the style hash property names containing ${...} strings that have
      * to be replaced using the createLiteral method before returning them.
-     * 
+     *
      * Returns:
      * {Object} hash of property names that need createLiteral parsing. The
      * name of the property is the key, and the value is true;
@@ -28975,15 +28995,15 @@
         }
         return propertyStyles;
     },
-    
+
     /**
      * Method: addPropertyStyles
-     * 
+     *
      * Parameters:
      * propertyStyles - {Object} hash to add new property styles to. Will be
      *                  modified inline
      * symbolizer     - {Object} search this symbolizer for property styles
-     * 
+     *
      * Returns:
      * {Object} propertyStyles hash
      */
@@ -28998,11 +29018,11 @@
         }
         return propertyStyles;
     },
-    
+
     /**
      * APIMethod: addRules
      * Adds rules to this style.
-     * 
+     *
      * Parameters:
      * rules - {Array(<OpenLayers.Rule>)}
      */
@@ -29010,27 +29030,27 @@
         this.rules = this.rules.concat(rules);
         this.propertyStyles = this.findPropertyStyles();
     },
-    
+
     /**
      * APIMethod: setDefaultStyle
      * Sets the default style for this style object.
-     * 
+     *
      * Parameters:
      * style - {Object} Hash of style properties
      */
     setDefaultStyle: function(style) {
-        this.defaultStyle = style; 
+        this.defaultStyle = style;
         this.propertyStyles = this.findPropertyStyles();
     },
-        
+
     /**
      * Method: getSymbolizerPrefix
      * Returns the correct symbolizer prefix according to the
      * geometry type of the passed geometry
-     * 
+     *
      * Parameters:
      * geometry {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {String} key of the according symbolizer
      */
@@ -29042,7 +29062,7 @@
             }
         }
     },
-    
+
     CLASS_NAME: "OpenLayers.Style"
 });
 
@@ -29051,7 +29071,7 @@
  * Function: createLiteral
  * converts a style value holding a combination of PropertyName and Literal
  * into a Literal, taking the property values from the passed features.
- * 
+ *
  * Parameters:
  * value - {String} value to parse. If this string contains a construct like
  *         "foo ${bar}", then "foo " will be taken as literal, and "${bar}"
@@ -29060,7 +29080,7 @@
  * context - {Object} context to take attribute values from
  * feature - {OpenLayers.Feature.Vector} The feature that will be passed
  *     to <OpenLayers.String.format> for evaluating functions in the context.
- * 
+ *
  * Returns:
  * {String} the parsed value. In the example of the value parameter above, the
  * result would be "foo valueOfBar", assuming that the passed feature has an
@@ -29073,7 +29093,7 @@
     }
     return value;
 };
-    
+
 /**
  * Constant: OpenLayers.Style.SYMBOLIZER_PREFIXES
  * {Array} prefixes of the sld symbolizers. These are the
@@ -29098,21 +29118,21 @@
 /**
  * Class: OpenLayers.Control.Navigation
  * The navigation control handles map browsing with mouse events (dragging,
- *     double-clicking, and scrolling the wheel).  Create a new navigation 
- *     control with the <OpenLayers.Control.Navigation> control.  
- * 
- *     Note that this control is added to the map by default (if no controls 
- *     array is sent in the options object to the <OpenLayers.Map> 
+ *     double-clicking, and scrolling the wheel).  Create a new navigation
+ *     control with the <OpenLayers.Control.Navigation> control.
+ *
+ *     Note that this control is added to the map by default (if no controls
+ *     array is sent in the options object to the <OpenLayers.Map>
  *     constructor).
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Control>
  */
 OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * Property: dragPan
-     * {<OpenLayers.Control.DragPan>} 
+     * {<OpenLayers.Control.DragPan>}
      */
     dragPan: null,
 
@@ -29122,7 +29142,7 @@
      */
     dragPanOptions: null,
 
-    /** 
+    /**
      * Property: zoomBox
      * {<OpenLayers.Control.ZoomBox>}
      */
@@ -29132,7 +29152,7 @@
      * APIProperty: zoomWheelEnabled
      * {Boolean} Whether the mousewheel should zoom the map
      */
-    zoomWheelEnabled: true, 
+    zoomWheelEnabled: true,
 
     /**
      * APIProperty: handleRightClicks
@@ -29143,18 +29163,18 @@
     /**
      * APIProperty: zoomBoxKeyMask
      * {Integer} <OpenLayers.Handler> key code of the key, which has to be
-     *    pressed, while drawing the zoom box with the mouse on the screen. 
+     *    pressed, while drawing the zoom box with the mouse on the screen.
      *    You should probably set handleRightClicks to true if you use this
      *    with MOD_CTRL, to disable the context menu for machines which use
      *    CTRL-Click as a right click.
      * Default: <OpenLayers.Handler.MOD_SHIFT
      */
     zoomBoxKeyMask: OpenLayers.Handler.MOD_SHIFT,
-    
+
     /**
      * Constructor: OpenLayers.Control.Navigation
      * Create a new navigation control
-     * 
+     *
      * Parameters:
      * options - {Object} An optional object whose properties will be set on
      *                    the control
@@ -29184,7 +29204,7 @@
         this.zoomBox = null;
         OpenLayers.Control.prototype.destroy.apply(this,arguments);
     },
-    
+
     /**
      * Method: activate
      */
@@ -29192,7 +29212,7 @@
         this.dragPan.activate();
         if (this.zoomWheelEnabled) {
             this.handlers.wheel.activate();
-        }    
+        }
         this.handlers.click.activate();
         this.zoomBox.activate();
         return OpenLayers.Control.prototype.activate.apply(this,arguments);
@@ -29208,7 +29228,7 @@
         this.handlers.wheel.deactivate();
         return OpenLayers.Control.prototype.deactivate.apply(this,arguments);
     },
-    
+
     /**
      * Method: draw
      */
@@ -29218,12 +29238,12 @@
             this.map.viewPortDiv.oncontextmenu = function () { return false;};
         }
 
-        var clickCallbacks = { 
-            'dblclick': this.defaultDblClick, 
-            'dblrightclick': this.defaultDblRightClick 
+        var clickCallbacks = {
+            'dblclick': this.defaultDblClick,
+            'dblrightclick': this.defaultDblRightClick
         };
         var clickOptions = {
-            'double': true, 
+            'double': true,
             'stopDouble': true
         };
         this.handlers.click = new OpenLayers.Handler.Click(
@@ -29243,29 +29263,29 @@
     },
 
     /**
-     * Method: defaultDblClick 
-     * 
+     * Method: defaultDblClick
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     defaultDblClick: function (evt) {
-        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
         this.map.setCenter(newCenter, this.map.zoom + 1);
     },
 
     /**
-     * Method: defaultDblRightClick 
-     * 
+     * Method: defaultDblRightClick
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     defaultDblRightClick: function (evt) {
-        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
         this.map.setCenter(newCenter, this.map.zoom - 1);
     },
-    
+
     /**
-     * Method: wheelChange  
+     * Method: wheelChange
      *
      * Parameters:
      * evt - {Event}
@@ -29287,10 +29307,10 @@
         this.map.setCenter( newCenter, newZoom );
     },
 
-    /** 
+    /**
      * Method: wheelUp
      * User spun scroll wheel up
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
@@ -29298,35 +29318,35 @@
         this.wheelChange(evt, 1);
     },
 
-    /** 
+    /**
      * Method: wheelDown
      * User spun scroll wheel down
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
     wheelDown: function(evt) {
         this.wheelChange(evt, -1);
     },
-    
+
     /**
      * Method: disableZoomWheel
      */
-    
+
     disableZoomWheel : function() {
         this.zoomWheelEnabled = false;
-        this.handlers.wheel.deactivate();       
+        this.handlers.wheel.deactivate();
     },
-    
+
     /**
      * Method: enableZoomWheel
      */
-    
+
     enableZoomWheel : function() {
         this.zoomWheelEnabled = true;
         if (this.active) {
             this.handlers.wheel.activate();
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Control.Navigation"
@@ -29338,7 +29358,7 @@
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
- 
+
 /**
  * @requires OpenLayers/Format/WKT.js
  * @requires OpenLayers/Feature/Vector.js
@@ -29366,19 +29386,19 @@
     parent: null,
 
     /**
-     * Property: bounds 
+     * Property: bounds
      * {<OpenLayers.Bounds>} The bounds of this geometry
      */
     bounds: null,
 
     /**
      * Constructor: OpenLayers.Geometry
-     * Creates a geometry object.  
+     * Creates a geometry object.
      */
     initialize: function() {
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME+ "_");
     },
-    
+
     /**
      * Method: destroy
      * Destroy this geometry.
@@ -29387,31 +29407,31 @@
         this.id = null;
         this.bounds = null;
     },
-    
+
     /**
      * APIMethod: clone
      * Create a clone of this geometry.  Does not set any non-standard
      *     properties of the cloned geometry.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Geometry>} An exact clone of this geometry.
      */
     clone: function() {
         return new OpenLayers.Geometry();
     },
-    
+
     /**
      * Set the bounds for this Geometry.
-     * 
+     *
      * Parameters:
-     * object - {<OpenLayers.Bounds>} 
+     * object - {<OpenLayers.Bounds>}
      */
     setBounds: function(bounds) {
         if (bounds) {
             this.bounds = bounds.clone();
         }
     },
-    
+
     /**
      * Method: clearBounds
      * Nullify this components bounds and that of its parent as well.
@@ -29420,16 +29440,16 @@
         this.bounds = null;
         if (this.parent) {
             this.parent.clearBounds();
-        }    
+        }
     },
-    
+
     /**
      * Method: extendBounds
-     * Extend the existing bounds to include the new bounds. 
+     * Extend the existing bounds to include the new bounds.
      * If geometry's bounds is not yet set, then set a new Bounds.
-     * 
+     *
      * Parameters:
-     * newBounds - {<OpenLayers.Bounds>} 
+     * newBounds - {<OpenLayers.Bounds>}
      */
     extendBounds: function(newBounds){
         var bounds = this.getBounds();
@@ -29439,12 +29459,12 @@
             this.bounds.extend(newBounds);
         }
     },
-    
+
     /**
      * APIMethod: getBounds
-     * Get the bounds for this Geometry. If bounds is not set, it 
+     * Get the bounds for this Geometry. If bounds is not set, it
      * is calculated again, this makes queries faster.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -29454,17 +29474,17 @@
         }
         return this.bounds;
     },
-    
-    /** 
+
+    /**
      * APIMethod: calculateBounds
-     * Recalculate the bounds for the geometry. 
+     * Recalculate the bounds for the geometry.
      */
     calculateBounds: function() {
         //
         // This should be overridden by subclasses.
         //
     },
-    
+
     /**
      * APIMethod: distanceTo
      * Calculate the closest distance between two geometries (on the x-y plane).
@@ -29475,7 +29495,7 @@
      *     calculation.
      *
      * Valid options depend on the specific geometry type.
-     * 
+     *
      * Returns:
      * {Number | Object} The distance between this geometry and the target.
      *     If details is true, the return will be an object with distance,
@@ -29486,7 +29506,7 @@
      */
     distanceTo: function(geometry, options) {
     },
-    
+
     /**
      * APIMethod: getVertices
      * Return a list of all points in this geometry.
@@ -29505,14 +29525,14 @@
 
     /**
      * Method: atPoint
-     * Note - This is only an approximation based on the bounds of the 
+     * Note - This is only an approximation based on the bounds of the
      * geometry.
-     * 
+     *
      * Parameters:
-     * lonlat - {<OpenLayers.LonLat>} 
+     * lonlat - {<OpenLayers.LonLat>}
      * toleranceLon - {float} Optional tolerance in Geometric Coords
      * toleranceLat - {float} Optional tolerance in Geographic Coords
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the geometry is at the specified location
      */
@@ -29523,8 +29543,8 @@
 
             var dX = (toleranceLon != null) ? toleranceLon : 0;
             var dY = (toleranceLat != null) ? toleranceLat : 0;
-    
-            var toleranceBounds = 
+
+            var toleranceBounds =
                 new OpenLayers.Bounds(this.bounds.left - dX,
                                       this.bounds.bottom - dY,
                                       this.bounds.right + dX,
@@ -29534,12 +29554,12 @@
         }
         return atPoint;
     },
-    
+
     /**
      * Method: getLength
      * Calculate the length of this geometry. This method is defined in
      * subclasses.
-     * 
+     *
      * Returns:
      * {Float} The length of the collection by summing its parts
      */
@@ -29552,7 +29572,7 @@
     /**
      * Method: getArea
      * Calculate the area of this geometry. This method is defined in subclasses.
-     * 
+     *
      * Returns:
      * {Float} The area of the collection by summing its parts
      */
@@ -29561,7 +29581,7 @@
         //
         return 0.0;
     },
-    
+
     /**
      * APIMethod: getCentroid
      * Calculate the centroid of this geometry. This method is defined in subclasses.
@@ -29619,7 +29639,7 @@
     }
     return geom;
 };
-    
+
 /**
  * Method: OpenLayers.Geometry.segmentsIntersect
  * Determine whether two line segments intersect.  Optionally calculates
@@ -29718,7 +29738,7 @@
                         }
                     }
                 }
-                
+
             }
         } else {
             // no calculated intersection, but segments could be within
@@ -29813,52 +29833,52 @@
  */
 OpenLayers.Layer.MapGuide = OpenLayers.Class(OpenLayers.Layer.Grid, {
 
-    /** 
+    /**
      * APIProperty: isBaseLayer
      * {Boolean} Treat this layer as a base layer.  Default is true.
      **/
     isBaseLayer: true,
-    
+
     /**
      * APIProperty: useHttpTile
-     * {Boolean} use a tile cache exposed directly via a webserver rather than the 
-	   *    via mapguide server. This does require extra configuration on the Mapguide Server,
-	   *    and will only work when singleTile is false. The url for the layer must be set to the
-	   *    webserver path rather than the Mapguide mapagent.	  
-	   *    See http://trac.osgeo.org/mapguide/wiki/CodeSamples/Tiles/ServingTilesViaHttp 
+     * {Boolean} use a tile cache exposed directly via a webserver rather than the
+       *    via mapguide server. This does require extra configuration on the Mapguide Server,
+       *    and will only work when singleTile is false. The url for the layer must be set to the
+       *    webserver path rather than the Mapguide mapagent.
+       *    See http://trac.osgeo.org/mapguide/wiki/CodeSamples/Tiles/ServingTilesViaHttp
      **/
     useHttpTile: false,
-    
-    /** 
+
+    /**
      * APIProperty: singleTile
-     * {Boolean} use tile server or request single tile image. 
+     * {Boolean} use tile server or request single tile image.
      **/
     singleTile: false,
-    
-    /** 
+
+    /**
      * APIProperty: useOverlay
      * {Boolean} flag to indicate if the layer should be retrieved using
      * GETMAPIMAGE (default) or using GETDYNAMICOVERLAY requests.
      **/
     useOverlay: false,
-    
-    /** 
+
+    /**
      * APIProperty: useAsyncOverlay
-     * {Boolean} indicates if the MapGuide site supports the asynchronous 
+     * {Boolean} indicates if the MapGuide site supports the asynchronous
      * GETDYNAMICOVERLAY requests which is available in MapGuide Enterprise 2010
-     * and MapGuide Open Source v2.0.3 or higher. The newer versions of MG 
-     * is called asynchronously, allows selections to be drawn separately from 
+     * and MapGuide Open Source v2.0.3 or higher. The newer versions of MG
+     * is called asynchronously, allows selections to be drawn separately from
      * the map and offers styling options.
-     * 
+     *
      * With older versions of MapGuide, set useAsyncOverlay=false.  Note that in
      * this case a synchronous AJAX call is issued and the mapname and session
      * parameters must be used to initialize the layer, not the mapdefinition
-     * parameter. Also note that this will issue a synchronous AJAX request 
+     * parameter. Also note that this will issue a synchronous AJAX request
      * before the image request can be issued so the users browser may lock
      * up if the MG Web tier does not respond in a timely fashion.
      **/
     useAsyncOverlay: true,
-    
+
     /**
      * Constant: TILE_PARAMS
      * {Object} Hashtable of default parameter key/value pairs for tiled layer
@@ -29879,7 +29899,7 @@
         clip: '1',
         version: '1.0.0'
     },
-    
+
     /**
      * Constant: OVERLAY_PARAMS
      * {Object} Hashtable of default parameter key/value pairs for untiled layer
@@ -29891,11 +29911,11 @@
         clip: '1',
         version: '2.0.0'
     },
-    
-    /** 
+
+    /**
      * Constant: FOLDER_PARAMS
-     * {Object} Hashtable of parameter key/value pairs which describe 
-     * the folder structure for tiles as configured in the mapguide 
+     * {Object} Hashtable of parameter key/value pairs which describe
+     * the folder structure for tiles as configured in the mapguide
      * serverconfig.ini section [TileServiceProperties]
      */
     FOLDER_PARAMS: {
@@ -29903,9 +29923,9 @@
         tileRowsPerFolder: 30,
         format: 'png',
         querystring: null
-    },	
+    },
 
-    /** 
+    /**
      * Property: defaultSize
      * {<OpenLayers.Size>} Tile size as produced by MapGuide server
      **/
@@ -29913,21 +29933,21 @@
 
     /**
      * Constructor: OpenLayers.Layer.MapGuide
-     * Create a new Mapguide layer, either tiled or untiled.  
+     * Create a new Mapguide layer, either tiled or untiled.
      *
-     * For tiled layers, the 'groupName' and 'mapDefinition' values 
+     * For tiled layers, the 'groupName' and 'mapDefinition' values
      * must be specified as parameters in the constructor.
      *
      * For untiled base layers, specify either combination of 'mapName' and
-     * 'session', or 'mapDefinition' and 'locale'.  
+     * 'session', or 'mapDefinition' and 'locale'.
      *
-     * For older versions of MapGuide and overlay layers, set useAsyncOverlay 
-     * to false and in this case mapName and session are required parameters 
+     * For older versions of MapGuide and overlay layers, set useAsyncOverlay
+     * to false and in this case mapName and session are required parameters
      * for the constructor.
      *
-     * NOTE: MapGuide OS uses a DPI value and degrees to meters conversion 
-     * factor that are different than the defaults used in OpenLayers, 
-     * so these must be adjusted accordingly in your application.  
+     * NOTE: MapGuide OS uses a DPI value and degrees to meters conversion
+     * factor that are different than the defaults used in OpenLayers,
+     * so these must be adjusted accordingly in your application.
      * See the MapGuide example for how to set these values for MGOS.
      *
      * Parameters:
@@ -29936,14 +29956,14 @@
      *            (e.g. http://localhost:8008/mapguide/mapagent/mapagent.fcgi)
      * params - {Object} hashtable of additional parameters to use. Some
      *     parameters may require additional code on the server. The ones that
-     *     you may want to use are: 
+     *     you may want to use are:
      *   - mapDefinition - {String} The MapGuide resource definition
      *            (e.g. Library://Samples/Gmap/Maps/gmapTiled.MapDefinition)
-     *   - locale - Locale setting 
+     *   - locale - Locale setting
      *            (for untiled overlays layers only)
      *   - mapName - {String} Name of the map as stored in the MapGuide session.
      *          (for untiled layers with a session parameter only)
-     *   - session - { String} MapGuide session ID 
+     *   - session - { String} MapGuide session ID
      *            (for untiled overlays layers only)
      *   - basemaplayergroupname - {String} GroupName for tiled MapGuide layers only
      *   - format - Image format to be returned (for untiled overlay layers only)
@@ -29957,24 +29977,24 @@
      *       groups to hide eg: 'cvc-xcv34,453-345-345sdf'
      *   - selectionXml - {String} A selection xml string Some server plumbing
      *       is required to read such a value.
-     * options - {Ojbect} Hashtable of extra options to tag onto the layer; 
+     * options - {Ojbect} Hashtable of extra options to tag onto the layer;
      *          will vary depending if tiled or untiled maps are being requested
      */
     initialize: function(name, url, params, options) {
-        
+
         OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments);
-        
-        // unless explicitly set in options, if the layer is transparent, 
+
+        // unless explicitly set in options, if the layer is transparent,
         // it will be an overlay
         if (options == null || options.isBaseLayer == null) {
-            this.isBaseLayer = ((this.transparent != "true") && 
+            this.isBaseLayer = ((this.transparent != "true") &&
                                 (this.transparent != true));
         }
 
         if (options && options.useOverlay!=null) {
           this.useOverlay = options.useOverlay;
         }
-        
+
         //initialize for untiled layers
         if (this.singleTile) {
           if (this.useOverlay) {
@@ -29990,7 +30010,7 @@
                            this.params,
                            this.SINGLE_TILE_PARAMS
                            );
-          }         
+          }
         } else {
             //initialize for tiled layers
             if (this.useHttpTile) {
@@ -30004,7 +30024,7 @@
                                this.TILE_PARAMS
                                );
             }
-            this.setTileSize(this.defaultSize); 
+            this.setTileSize(this.defaultSize);
         }
     },
 
@@ -30030,17 +30050,17 @@
 
     /**
      * Method: addTile
-     * Creates a tile, initializes it, and adds it to the layer div. 
+     * Creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
 
@@ -30049,12 +30069,12 @@
      * Return a query string for this layer
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox 
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox
      *                                for the request
      *
      * Returns:
-     * {String} A string with the layer's url and parameters and also 
-     *          the passed-in bounds and appropriate tile size specified 
+     * {String} A string with the layer's url and parameters and also
+     *          the passed-in bounds and appropriate tile size specified
      *          as parameters.
      */
     getURL: function (bounds) {
@@ -30073,7 +30093,7 @@
             setviewcentery: center.lat,
             setviewscale: this.map.getScale()
           };
-          
+
           if (this.useOverlay && !this.useAsyncOverlay) {
             //first we need to call GETVISIBLEMAPEXTENT to set the extent
             var getVisParams = {};
@@ -30084,7 +30104,7 @@
             getVisParams.mapName = this.params.mapName;
             getVisParams.format = 'text/xml';
             url = this.getFullRequestString( getVisParams );
-            
+
             OpenLayers.Request.GET({url: url, async: false});
           }
           //construct the full URL
@@ -30099,13 +30119,13 @@
           rowidx = Math.round(rowidx/this.tileSize.h);
 
           if (this.useHttpTile){
-	          url = this.getImageFilePath(
+              url = this.getImageFilePath(
                    {
                        tilecol: colidx,
                        tilerow: rowidx,
                        scaleindex: this.resolutions.length - this.map.zoom - 1
                     });
-		  
+
           } else {
             url = this.getFullRequestString(
                    {
@@ -30120,7 +30140,7 @@
 
     /**
      * Method: getFullRequestString
-     * getFullRequestString on MapGuide layers is special, because we 
+     * getFullRequestString on MapGuide layers is special, because we
      * do a regular expression replace on ',' in parameters to '+'.
      * This is why it is subclassed here.
      *
@@ -30133,17 +30153,17 @@
     getFullRequestString:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // if url is not a string, it should be an array of strings, 
+
+        // if url is not a string, it should be an array of strings,
         //  in which case we will randomly select one of them in order
         //  to evenly distribute requests to different urls.
         if (typeof url == "object") {
             url = url[Math.floor(Math.random()*url.length)];
-        }   
+        }
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
-        // create a new params hashtable with all the layer params and the 
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
@@ -30156,7 +30176,7 @@
             }
         }
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         /* MapGuide needs '+' seperating things like bounds/height/width.
            Since typically this is URL encoded, we use a slight hack: we
            depend on the list-like functionality of getParameterString to
@@ -30164,7 +30184,7 @@
            encoded) then do a regular expression replace on the , characters
            to '+' */
         paramsString = paramsString.replace(/,/g, "+");
-        
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -30182,9 +30202,9 @@
         return requestString;
     },
 
-     /** 
+     /**
      * Method: getImageFilePath
-     * special handler to request mapguide tiles from an http exposed tilecache 
+     * special handler to request mapguide tiles from an http exposed tilecache
      *
      * Parameters:
      * altUrl - {String} Alternative base URL to use.
@@ -30195,58 +30215,58 @@
     getImageFilePath:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // if url is not a string, it should be an array of strings, 
+
+        // if url is not a string, it should be an array of strings,
         //  in which case we will randomly select one of them in order
         //  to evenly distribute requests to different urls.
         if (typeof url == "object") {
             url = url[Math.floor(Math.random()*url.length)];
-        }   
+        }
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
         var tileRowGroup = "";
         var tileColGroup = "";
-        
+
         if (newParams.tilerow < 0) {
           tileRowGroup =  '-';
         }
-          
+
         if (newParams.tilerow == 0 ) {
           tileRowGroup += '0';
         } else {
           tileRowGroup += Math.floor(Math.abs(newParams.tilerow/this.params.tileRowsPerFolder)) * this.params.tileRowsPerFolder;
         }
-          
+
         if (newParams.tilecol < 0) {
           tileColGroup =  '-';
         }
-        
+
         if (newParams.tilecol == 0) {
           tileColGroup += '0';
         } else {
           tileColGroup += Math.floor(Math.abs(newParams.tilecol/this.params.tileColumnsPerFolder)) * this.params.tileColumnsPerFolder;
-        }					
-        
+        }
+
         var tilePath = '/S' + Math.floor(newParams.scaleindex)
                 + '/' + this.params.basemaplayergroupname
                 + '/R' + tileRowGroup
                 + '/C' + tileColGroup
-                + '/' + (newParams.tilerow % this.params.tileRowsPerFolder) 
-                + '_' + (newParams.tilecol % this.params.tileColumnsPerFolder) 
+                + '/' + (newParams.tilerow % this.params.tileRowsPerFolder)
+                + '_' + (newParams.tilecol % this.params.tileColumnsPerFolder)
                 + '.' + this.params.format;
-    
+
         if (this.params.querystring) {
                tilePath += "?" + this.params.querystring;
         }
-        
+
         requestString += tilePath;
         return requestString;
     },
-    
-    /** 
+
+    /**
      * Method: calculateGridLayout
-     * Generate parameters for the grid layout. This  
+     * Generate parameters for the grid layout. This
      *
      * Parameters:
      * bounds - {<OpenLayers.Bound>}
@@ -30260,26 +30280,26 @@
     calculateGridLayout: function(bounds, extent, resolution) {
         var tilelon = resolution * this.tileSize.w;
         var tilelat = resolution * this.tileSize.h;
-        
+
         var offsetlon = bounds.left - extent.left;
         var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
         var tilecolremain = offsetlon/tilelon - tilecol;
         var tileoffsetx = -tilecolremain * this.tileSize.w;
         var tileoffsetlon = extent.left + tilecol * tilelon;
-        
-        var offsetlat = extent.top - bounds.top + tilelat; 
+
+        var offsetlat = extent.top - bounds.top + tilelat;
         var tilerow = Math.floor(offsetlat/tilelat) - this.buffer;
         var tilerowremain = tilerow - offsetlat/tilelat;
         var tileoffsety = tilerowremain * this.tileSize.h;
         var tileoffsetlat = extent.top - tilelat*tilerow;
-        
-        return { 
+
+        return {
           tilelon: tilelon, tilelat: tilelat,
           tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
           tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
         };
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.MapGuide"
 });
 /* ======================================================================
@@ -30306,7 +30326,7 @@
 
     /**
      * Constant: DEFAULT_PARAMS
-     * {Object} Hashtable of default parameter key/value pairs 
+     * {Object} Hashtable of default parameter key/value pairs
      */
     DEFAULT_PARAMS: {
         mode: "map",
@@ -30334,10 +30354,10 @@
             this.params, this.DEFAULT_PARAMS
         );
 
-        // unless explicitly set in options, if the layer is transparent, 
+        // unless explicitly set in options, if the layer is transparent,
         // it will be an overlay
         if (options == null || options.isBaseLayer == null) {
-            this.isBaseLayer = ((this.params.transparent != "true") && 
+            this.isBaseLayer = ((this.params.transparent != "true") &&
                                 (this.params.transparent != true));
         }
     },
@@ -30366,41 +30386,41 @@
 
     /**
      * Method: addTile
-     * Creates a tile, initializes it, and adds it to the layer div. 
+     * Creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
-    
+
     /**
      * Method: getURL
      * Return a query string for this layer
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox 
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox
      *                                for the request
      *
      * Returns:
-     * {String} A string with the layer's url and parameters and also 
-     *          the passed-in bounds and appropriate tile size specified 
+     * {String} A string with the layer's url and parameters and also
+     *          the passed-in bounds and appropriate tile size specified
      *          as parameters.
      */
     getURL: function (bounds) {
         bounds = this.adjustBounds(bounds);
-        // Make a list, so that getFullRequestString uses literal "," 
+        // Make a list, so that getFullRequestString uses literal ","
         var extent = [bounds.left, bounds. bottom, bounds.right, bounds.top];
 
-        var imageSize = this.getImageSize(); 
-        
-        // make lists, so that literal ','s are used 
+        var imageSize = this.getImageSize();
+
+        // make lists, so that literal ','s are used
         var url = this.getFullRequestString(
                      {mapext:   extent,
                       imgext:   extent,
@@ -30409,40 +30429,40 @@
                       imgy:     imageSize.h / 2,
                       imgxy:    [imageSize.w, imageSize.h]
                       });
-        
+
         return url;
     },
-    
-    /** 
+
+    /**
      * Method: getFullRequestString
-     * combine the layer's url with its params and these newParams. 
-     *   
+     * combine the layer's url with its params and these newParams.
+     *
      * Parameter:
-     * newParams - {Object} New parameters that should be added to the 
+     * newParams - {Object} New parameters that should be added to the
      *                      request string.
-     * altUrl - {String} (optional) Replace the URL in the full request  
+     * altUrl - {String} (optional) Replace the URL in the full request
      *                              string with the provided URL.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} A string with the layer's url and parameters embedded in it.
      */
     getFullRequestString:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // create a new params hashtable with all the layer params and the 
+
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
-        // if url is not a string, it should be an array of strings, 
-        // in which case we will deterministically select one of them in 
+
+        // if url is not a string, it should be an array of strings,
+        // in which case we will deterministically select one of them in
         // order to evenly distribute requests to different urls.
         if (url instanceof Array) {
             url = this.selectUrl(paramsString, url);
-        }   
-        
+        }
+
         // ignore parameters that are already in the url search string
         var urlParams = OpenLayers.Util.upperCaseObject(
                             OpenLayers.Util.getParameters(url));
@@ -30452,9 +30472,9 @@
             }
         }
         paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
         // MapServer needs '+' seperating things like bounds/height/width.
         //   Since typically this is URL encoded, we use a slight hack: we
@@ -30464,7 +30484,7 @@
         //  to '+'
         //
         paramsString = paramsString.replace(/,/g, "+");
-        
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -30503,7 +30523,7 @@
  * Instances of OpenLayers.Layer.WMS are used to display data from OGC Web
  *     Mapping Services. Create a new WMS layer with the <OpenLayers.Layer.WMS>
  *     constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.Grid>
  */
@@ -30511,7 +30531,7 @@
 
     /**
      * Constant: DEFAULT_PARAMS
-     * {Object} Hashtable of default parameter key/value pairs 
+     * {Object} Hashtable of default parameter key/value pairs
      */
     DEFAULT_PARAMS: { service: "WMS",
                       version: "1.1.1",
@@ -30520,48 +30540,48 @@
                       exceptions: "application/vnd.ogc.se_inimage",
                       format: "image/jpeg"
                      },
-    
+
     /**
      * Property: reproject
      * *Deprecated*. See http://trac.openlayers.org/wiki/SphericalMercator
-     * for information on the replacement for this functionality. 
+     * for information on the replacement for this functionality.
      * {Boolean} Try to reproject this layer if its coordinate reference system
-     *           is different than that of the base layer.  Default is true.  
-     *           Set this in the layer options.  Should be set to false in 
+     *           is different than that of the base layer.  Default is true.
+     *           Set this in the layer options.  Should be set to false in
      *           most cases.
      */
     reproject: false,
- 
+
     /**
      * APIProperty: isBaseLayer
      * {Boolean} Default is true for WMS layer
      */
     isBaseLayer: true,
-    
+
     /**
      * APIProperty: encodeBBOX
-     * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no', 
+     * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no',
      * but some services want it that way. Default false.
      */
     encodeBBOX: false,
-    
-    /** 
-     * APIProperty: noMagic 
-     * {Boolean} If true, the image format will not be automagicaly switched 
-     *     from image/jpeg to image/png or image/gif when using 
-     *     TRANSPARENT=TRUE. Also isBaseLayer will not changed by the  
-     *     constructor. Default false. 
-     */ 
-    noMagic: false,  
-    
+
     /**
+     * APIProperty: noMagic
+     * {Boolean} If true, the image format will not be automagicaly switched
+     *     from image/jpeg to image/png or image/gif when using
+     *     TRANSPARENT=TRUE. Also isBaseLayer will not changed by the
+     *     constructor. Default false.
+     */
+    noMagic: false,
+
+    /**
      * Constructor: OpenLayers.Layer.WMS
      * Create a new WMS layer object
      *
      * Example:
      * (code)
      * var wms = new OpenLayers.Layer.WMS("NASA Global Mosaic",
-     *                                    "http://wms.jpl.nasa.gov/wms.cgi", 
+     *                                    "http://wms.jpl.nasa.gov/wms.cgi",
      *                                    {layers: "modis,global_mosaic"});
      * (end)
      *
@@ -30580,21 +30600,21 @@
         newArguments.push(name, url, params, options);
         OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
         OpenLayers.Util.applyDefaults(
-                       this.params, 
+                       this.params,
                        OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
                        );
 
 
-        //layer is transparent        
-        if (!this.noMagic && this.params.TRANSPARENT && 
+        //layer is transparent
+        if (!this.noMagic && this.params.TRANSPARENT &&
             this.params.TRANSPARENT.toString().toLowerCase() == "true") {
-            
+
             // unless explicitly set in options, make layer an overlay
             if ( (options == null) || (!options.isBaseLayer) ) {
                 this.isBaseLayer = false;
-            } 
-            
-            // jpegs can never be transparent, so intelligently switch the 
+            }
+
+            // jpegs can never be transparent, so intelligently switch the
             //  format, depending on teh browser's capabilities
             if (this.params.FORMAT == "image/jpeg") {
                 this.params.FORMAT = OpenLayers.Util.alphaHack() ? "image/gif"
@@ -30602,18 +30622,18 @@
             }
         }
 
-    },    
+    },
 
     /**
      * Method: destroy
      * Destroy this layer
      */
     destroy: function() {
-        // for now, nothing special to do here. 
-        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+        // for now, nothing special to do here.
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);
     },
 
-    
+
     /**
      * Method: clone
      * Create a clone of this layer
@@ -30622,7 +30642,7 @@
      * {<OpenLayers.Layer.WMS>} An exact clone of this layer
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.WMS(this.name,
                                            this.url,
@@ -30636,8 +30656,8 @@
         // copy/set any non-init, non-simple values here
 
         return obj;
-    },    
-    
+    },
+
     /**
      * Method: getURL
      * Return a GetMap query string for this layer
@@ -30648,13 +30668,13 @@
      *
      * Returns:
      * {String} A string with the layer's url and parameters and also the
-     *          passed-in bounds and appropriate tile size specified as 
+     *          passed-in bounds and appropriate tile size specified as
      *          parameters.
      */
     getURL: function (bounds) {
         bounds = this.adjustBounds(bounds);
-        
-        var imageSize = this.getImageSize(); 
+
+        var imageSize = this.getImageSize();
         var newParams = {
             'BBOX': this.encodeBBOX ?  bounds.toBBOX() : bounds.toArray(),
             'WIDTH': imageSize.w,
@@ -30666,17 +30686,17 @@
 
     /**
      * Method: addTile
-     * addTile creates a tile, initializes it, and adds it to the layer div. 
+     * addTile creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
 
@@ -30684,34 +30704,34 @@
      * APIMethod: mergeNewParams
      * Catch changeParams and uppercase the new params to be merged in
      *     before calling changeParams on the super class.
-     * 
+     *
      *     Once params have been changed, the tiles will be reloaded with
      *     the new parameters.
-     * 
+     *
      * Parameters:
      * newParams - {Object} Hashtable of new params to use
      */
     mergeNewParams:function(newParams) {
         var upperParams = OpenLayers.Util.upperCaseObject(newParams);
         var newArguments = [upperParams];
-        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, 
+        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,
                                                              newArguments);
     },
 
-    /** 
+    /**
      * APIMethod: getFullRequestString
-     * Combine the layer's url with its params and these newParams. 
-     *   
+     * Combine the layer's url with its params and these newParams.
+     *
      *     Add the SRS parameter from projection -- this is probably
-     *     more eloquently done via a setProjection() method, but this 
+     *     more eloquently done via a setProjection() method, but this
      *     works for now and always.
      *
      * Parameters:
      * newParams - {Object}
      * altUrl - {String} Use this as the url instead of the layer's url
-     * 
+     *
      * Returns:
-     * {String} 
+     * {String}
      */
     getFullRequestString:function(newParams, altUrl) {
         var projectionCode = this.map.getProjection();
@@ -30728,7 +30748,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 
@@ -30742,25 +30762,25 @@
  * This class represents an SLD Rule, as being used for rule-based SLD styling.
  */
 OpenLayers.Rule = OpenLayers.Class({
-    
+
     /**
      * Property: id
      * {String} A unique id for this session.
      */
     id: null,
-    
+
     /**
      * APIProperty: name
      * {String} name of this rule
      */
     name: 'default',
-    
+
     /**
      * Property: title
      * {String} Title of this rule (set if included in SLD)
      */
     title: null,
-    
+
     /**
      * Property: description
      * {String} Description of this rule (set if abstract is included in SLD)
@@ -30774,7 +30794,7 @@
      * be used.
      */
     context: null,
-    
+
     /**
      * Property: filter
      * {<OpenLayers.Filter>} Optional filter for the rule.
@@ -30784,13 +30804,13 @@
     /**
      * Property: elseFilter
      * {Boolean} Determines whether this rule is only to be applied only if
-     * no other rules match (ElseFilter according to the SLD specification). 
+     * no other rules match (ElseFilter according to the SLD specification).
      * Default is false.  For instances of OpenLayers.Rule, if elseFilter is
-     * false, the rule will always apply.  For subclasses, the else property is 
+     * false, the rule will always apply.  For subclasses, the else property is
      * ignored.
      */
     elseFilter: false,
-    
+
     /**
      * Property: symbolizer
      * {Object} Symbolizer or hash of symbolizers for this rule. If hash of
@@ -30801,7 +30821,7 @@
      * SLD.
      */
     symbolizer: null,
-    
+
     /**
      * APIProperty: minScaleDenominator
      * {Number} or {String} minimum scale at which to draw the feature.
@@ -30817,15 +30837,15 @@
      * propertyNames in the form "literal ${propertyName}"
      */
     maxScaleDenominator: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Rule
      * Creates a Rule.
      *
      * Parameters:
      * options - {Object} An optional object with properties to set on the
      *           rule
-     * 
+     *
      * Returns:
      * {<OpenLayers.Rule>}
      */
@@ -30835,7 +30855,7 @@
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -30845,14 +30865,14 @@
         }
         this.symbolizer = null;
     },
-    
+
     /**
      * APIMethod: evaluate
      * evaluates this rule for a specific feature
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} feature to apply the rule to.
-     * 
+     *
      * Returns:
      * {Boolean} true if the rule applies, false if it does not.
      * This rule is the default rule and always returns true.
@@ -30864,7 +30884,7 @@
         if (this.minScaleDenominator || this.maxScaleDenominator) {
             var scale = feature.layer.map.getScale();
         }
-        
+
         // check if within minScale/maxScale bounds
         if (this.minScaleDenominator) {
             applies = scale >= OpenLayers.Style.createLiteral(
@@ -30874,7 +30894,7 @@
             applies = scale < OpenLayers.Style.createLiteral(
                     this.maxScaleDenominator, context);
         }
-        
+
         // check if optional filter applies
         if(applies && this.filter) {
             // feature id filters get the feature, others get the context
@@ -30887,11 +30907,11 @@
 
         return applies;
     },
-    
+
     /**
      * Method: getContext
      * Gets the context for evaluating this rule
-     * 
+     *
      * Paramters:
      * feature - {<OpenLayers.Feature>} feature to take the context from if
      *           none is specified.
@@ -30906,11 +30926,11 @@
         }
         return context;
     },
-    
+
     /**
      * APIMethod: clone
      * Clones this rule.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Rule>} Clone of this rule.
      */
@@ -30933,7 +30953,7 @@
         options.context = this.context && OpenLayers.Util.extend({}, this.context);
         return new OpenLayers.Rule(options);
     },
-        
+
     CLASS_NAME: "OpenLayers.Rule"
 });
 /* ======================================================================
@@ -30948,19 +30968,19 @@
  * @requires OpenLayers/Style.js
  * @requires OpenLayers/Feature/Vector.js
  */
- 
+
 /**
  * Class: OpenLayers.StyleMap
  */
 OpenLayers.StyleMap = OpenLayers.Class({
-    
+
     /**
      * Property: styles
      * Hash of {<OpenLayers.Style>}, keyed by names of well known
      * rendering intents (e.g. "default", "temporary", "select", "delete").
      */
     styles: null,
-    
+
     /**
      * Property: extendDefault
      * {Boolean} if true, every render intent will extend the symbolizers
@@ -30968,10 +30988,10 @@
      * rendering intent will be treated as a completely independent style.
      */
     extendDefault: true,
-    
+
     /**
      * Constructor: OpenLayers.StyleMap
-     * 
+     *
      * Parameters:
      * style   - {Object} Optional. Either a style hash, or a style object, or
      *           a hash of style objects (style hashes) keyed by rendering
@@ -30992,7 +31012,7 @@
             "delete": new OpenLayers.Style(
                 OpenLayers.Feature.Vector.style["delete"])
         };
-        
+
         // take whatever the user passed as style parameter and convert it
         // into parts of stylemap.
         if(style instanceof OpenLayers.Style) {
@@ -31031,11 +31051,11 @@
         }
         this.styles = null;
     },
-    
+
     /**
      * Method: createSymbolizer
      * Creates the symbolizer for a feature for a render intent.
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} The feature to evaluate the rules
      *           of the intended style against.
@@ -31043,7 +31063,7 @@
      *           used to draw the feature. Well known intents are "default"
      *           (for just drawing the features), "select" (for selected
      *           features) and "temporary" (for drawing features).
-     * 
+     *
      * Returns:
      * {Object} symbolizer hash
      */
@@ -31062,20 +31082,20 @@
         return OpenLayers.Util.extend(defaultSymbolizer,
             this.styles[intent].createSymbolizer(feature));
     },
-    
+
     /**
      * Method: addUniqueValueRules
      * Convenience method to create comparison rules for unique values of a
      * property. The rules will be added to the style object for a specified
      * rendering intent. This method is a shortcut for creating something like
      * the "unique value legends" familiar from well known desktop GIS systems
-     * 
+     *
      * Parameters:
      * renderIntent - {String} rendering intent to add the rules to
      * property     - {String} values of feature attributes to create the
      *                rules for
      * symbolizers  - {Object} Hash of symbolizers, keyed by the desired
-     *                property values 
+     *                property values
      * context      - {Object} An optional object with properties that
      *                symbolizers' property values should be evaluated
      *                against. If no context is specified, feature.attributes
@@ -31113,21 +31133,21 @@
 
 /**
  * Class: OpenLayers.Geometry.Collection
- * A Collection is exactly what it sounds like: A collection of different 
+ * A Collection is exactly what it sounds like: A collection of different
  * Geometries. These are stored in the local parameter <components> (which
- * can be passed as a parameter to the constructor). 
- * 
- * As new geometries are added to the collection, they are NOT cloned. 
- * When removing geometries, they need to be specified by reference (ie you 
+ * can be passed as a parameter to the constructor).
+ *
+ * As new geometries are added to the collection, they are NOT cloned.
+ * When removing geometries, they need to be specified by reference (ie you
  * have to pass in the *exact* geometry to be removed).
- * 
+ *
  * The <getArea> and <getLength> functions here merely iterate through
  * the components, summing their respective areas and lengths.
  *
  * Create a new instance with the <OpenLayers.Geometry.Collection> constructor.
  *
  * Inerhits from:
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Collection = OpenLayers.Class(OpenLayers.Geometry, {
 
@@ -31136,7 +31156,7 @@
      * {Array(<OpenLayers.Geometry>)} The component parts of this geometry
      */
     components: null,
-    
+
     /**
      * Property: componentTypes
      * {Array(String)} An array of class names representing the types of
@@ -31149,7 +31169,7 @@
      * Constructor: OpenLayers.Geometry.Collection
      * Creates a Geometry Collection -- a list of geoms.
      *
-     * Parameters: 
+     * Parameters:
      * components - {Array(<OpenLayers.Geometry>)} Optional array of geometries
      *
      */
@@ -31182,31 +31202,31 @@
         for(var i=0, len=this.components.length; i<len; i++) {
             geometry.addComponent(this.components[i].clone());
         }
-        
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(geometry, this);
-        
+
         return geometry;
     },
 
     /**
      * Method: getComponentsString
      * Get a string representing the components for this collection
-     * 
+     *
      * Returns:
      * {String} A string representation of the components of this geometry
      */
     getComponentsString: function(){
         var strings = [];
         for(var i=0, len=this.components.length; i<len; i++) {
-            strings.push(this.components[i].toShortString()); 
+            strings.push(this.components[i].toShortString());
         }
         return strings.join(",");
     },
 
     /**
      * APIMethod: calculateBounds
-     * Recalculate the bounds by iterating through the components and 
+     * Recalculate the bounds by iterating through the components and
      * calling calling extendBounds() on each item.
      */
     calculateBounds: function() {
@@ -31241,14 +31261,14 @@
      * is set, then the component class name must be in the componentTypes array.
      *
      * The bounds cache is reset.
-     * 
+     *
      * Parameters:
      * component - {<OpenLayers.Geometry>} A geometry to add
      * index - {int} Optional index into the array to insert the component
      *
      * Returns:
      * {Boolean} The component geometry was successfully added
-     */    
+     */
     addComponent: function(component, index) {
         var added = false;
         if(component) {
@@ -31258,7 +31278,7 @@
 
                 if(index != null && (index < this.components.length)) {
                     var components1 = this.components.slice(0, index);
-                    var components2 = this.components.slice(index, 
+                    var components2 = this.components.slice(index,
                                                            this.components.length);
                     components1.push(component);
                     this.components = components1.concat(components2);
@@ -31272,7 +31292,7 @@
         }
         return added;
     },
-    
+
     /**
      * APIMethod: removeComponents
      * Remove components from this geometry.
@@ -31288,18 +31308,18 @@
             this.removeComponent(components[i]);
         }
     },
-    
+
     /**
      * Method: removeComponent
      * Remove a component from this geometry.
      *
      * Parameters:
-     * component - {<OpenLayers.Geometry>} 
+     * component - {<OpenLayers.Geometry>}
      */
     removeComponent: function(component) {
-        
+
         OpenLayers.Util.removeItem(this.components, component);
-        
+
         // clearBounds() so that it gets recalculated on the next call
         // to this.getBounds();
         this.clearBounds();
@@ -31319,7 +31339,7 @@
         }
         return length;
     },
-    
+
     /**
      * APIMethod: getArea
      * Calculate the area of this geometry. Note how this function is overridden
@@ -31336,7 +31356,7 @@
         return area;
     },
 
-    /** 
+    /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
      *     the earth.
@@ -31345,7 +31365,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -31361,7 +31381,7 @@
         }
         return area;
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -31391,7 +31411,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Returns:
      * {Float} The appoximate geodesic length of the geometry in meters.
      */
@@ -31410,7 +31430,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -31446,9 +31466,9 @@
      *                 will have four times the area).
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         for(var i=0; i<this.components.length; ++i) {
@@ -31503,13 +31523,13 @@
         return best;
     },
 
-    /** 
+    /**
      * APIMethod: equals
      * Determine whether another geometry is equivalent to this one.  Geometries
      *     are considered equivalent if all components have the same coordinates.
-     * 
+     *
      * Parameters:
-     * geom - {<OpenLayers.Geometry>} The geometry to test. 
+     * geom - {<OpenLayers.Geometry>} The geometry to test.
      *
      * Returns:
      * {Boolean} The supplied geometry is equivalent to this geometry.
@@ -31536,17 +31556,17 @@
     /**
      * APIMethod: transform
      * Reproject the components geometry from source to dest.
-     * 
+     *
      * Parameters:
-     * source - {<OpenLayers.Projection>} 
+     * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if (source && dest) {
-            for (var i=0, len=this.components.length; i<len; i++) {  
+            for (var i=0, len=this.components.length; i<len; i++) {
                 var component = this.components[i];
                 component.transform(source, dest);
             }
@@ -31616,22 +31636,22 @@
 
 /**
  * Class: OpenLayers.Geometry.Point
- * Point geometry class. 
- * 
+ * Point geometry class.
+ *
  * Inherits from:
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
 
-    /** 
-     * APIProperty: x 
-     * {float} 
+    /**
+     * APIProperty: x
+     * {float}
      */
     x: null,
 
-    /** 
-     * APIProperty: y 
-     * {float} 
+    /**
+     * APIProperty: y
+     * {float}
      */
     y: null,
 
@@ -31640,20 +31660,20 @@
      * Construct a point geometry.
      *
      * Parameters:
-     * x - {float} 
+     * x - {float}
      * y - {float}
-     * 
+     *
      */
     initialize: function(x, y) {
         OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
-        
+
         this.x = parseFloat(x);
         this.y = parseFloat(y);
     },
 
     /**
      * APIMethod: clone
-     * 
+     *
      * Returns:
      * {<OpenLayers.Geometry.Point>} An exact clone of this OpenLayers.Geometry.Point
      */
@@ -31668,7 +31688,7 @@
         return obj;
     },
 
-    /** 
+    /**
      * Method: calculateBounds
      * Create a new Bounds based on the lon/lat
      */
@@ -31729,14 +31749,14 @@
         }
         return result;
     },
-    
-    /** 
+
+    /**
      * APIMethod: equals
      * Determine whether another geometry is equivalent to this one.  Geometries
      *     are considered equivalent if all components have the same coordinates.
-     * 
+     *
      * Parameters:
-     * geom - {<OpenLayers.Geometry.Point>} The geometry to test. 
+     * geom - {<OpenLayers.Geometry.Point>} The geometry to test.
      *
      * Returns:
      * {Boolean} The supplied geometry is equivalent to this geometry.
@@ -31749,18 +31769,18 @@
         }
         return equals;
     },
-    
+
     /**
      * Method: toShortString
      *
      * Returns:
-     * {String} Shortened String representation of Point object. 
+     * {String} Shortened String representation of Point object.
      *         (ex. <i>"5, 42"</i>)
      */
     toShortString: function() {
         return (this.x + ", " + this.y);
     },
-    
+
     /**
      * APIMethod: move
      * Moves a geometry by the given displacement along positive x and y axes.
@@ -31768,7 +31788,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -31794,7 +31814,7 @@
         this.y = origin.y + (radius * Math.sin(theta));
         this.clearBounds();
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -31817,9 +31837,9 @@
      *                 distance between the point and origin.
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         ratio = (ratio == undefined) ? 1 : ratio;
@@ -31828,7 +31848,7 @@
         this.clearBounds();
         return this;
     },
-    
+
     /**
      * APIMethod: intersects
      * Determine if the input geometry intersects this one.
@@ -31848,24 +31868,24 @@
         }
         return intersect;
     },
-    
+
     /**
      * APIMethod: transform
      * Translate the x,y properties of the point from source to dest.
-     * 
+     *
      * Parameters:
-     * source - {<OpenLayers.Projection>} 
+     * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if ((source && dest)) {
             OpenLayers.Projection.transform(
-                this, source, dest); 
+                this, source, dest);
             this.bounds = null;
-        }       
+        }
         return this;
     },
 
@@ -31960,14 +31980,14 @@
      * featureunselected - Triggered after a feature is unselected.
      *      Listeners will receive an object with a *feature* property
      *      referencing the unselected feature.
-     * beforefeaturemodified - Triggered when a feature is selected to 
-     *      be modified.  Listeners will receive an object with a *feature* 
+     * beforefeaturemodified - Triggered when a feature is selected to
+     *      be modified.  Listeners will receive an object with a *feature*
      *      property referencing the selected feature.
      * featuremodified - Triggered when a feature has been modified.
-     *      Listeners will receive an object with a *feature* property referencing 
+     *      Listeners will receive an object with a *feature* property referencing
      *      the modified feature.
      * afterfeaturemodified - Triggered when a feature is finished being modified.
-     *      Listeners will receive an object with a *feature* property referencing 
+     *      Listeners will receive an object with a *feature* property referencing
      *      the modified feature.
      * vertexmodified - Triggered when a vertex within any feature geometry
      *      has been modified.  Listeners will receive an object with a
@@ -31993,7 +32013,7 @@
     EVENT_TYPES: ["beforefeatureadded", "beforefeaturesadded",
                   "featureadded", "featuresadded",
                   "beforefeatureremoved", "featureremoved", "featuresremoved",
-                  "beforefeatureselected", "featureselected", "featureunselected", 
+                  "beforefeatureselected", "featureselected", "featureunselected",
                   "beforefeaturemodified", "featuremodified", "afterfeaturemodified",
                   "vertexmodified", "sketchstarted", "sketchmodified",
                   "sketchcomplete", "refresh"],
@@ -32005,31 +32025,31 @@
      */
     isBaseLayer: false,
 
-    /** 
+    /**
      * APIProperty: isFixed
      * {Boolean} Whether the layer remains in one place while dragging the
      * map.
      */
     isFixed: false,
 
-    /** 
+    /**
      * APIProperty: isVector
      * {Boolean} Whether the layer is a vector layer.
      */
     isVector: true,
-    
-    /** 
+
+    /**
      * APIProperty: features
-     * {Array(<OpenLayers.Feature.Vector>)} 
+     * {Array(<OpenLayers.Feature.Vector>)}
      */
     features: null,
-    
-    /** 
+
+    /**
      * Property: selectedFeatures
-     * {Array(<OpenLayers.Feature.Vector>)} 
+     * {Array(<OpenLayers.Feature.Vector>)}
      */
     selectedFeatures: null,
-    
+
     /**
      * Property: unrenderedFeatures
      * {Object} hash of features, keyed by feature.id, that the renderer
@@ -32042,32 +32062,32 @@
      * {Boolean} report friendly error message when loading of renderer
      * fails.
      */
-    reportError: true, 
+    reportError: true,
 
-    /** 
+    /**
      * APIProperty: style
      * {Object} Default style for the layer
      */
     style: null,
-    
+
     /**
      * Property: styleMap
      * {<OpenLayers.StyleMap>}
      */
     styleMap: null,
-    
+
     /**
      * Property: strategies
      * {Array(<OpenLayers.Strategy>})} Optional list of strategies for the layer.
      */
     strategies: null,
-    
+
     /**
      * Property: protocol
      * {<OpenLayers.Protocol>} Optional protocol for the layer.
      */
     protocol: null,
-    
+
     /**
      * Property: renderers
      * {Array(String)} List of supported Renderer classes. Add to this list to
@@ -32076,21 +32096,21 @@
      * method will be used, if not defined in the 'renderer' option.
      */
     renderers: ['SVG', 'VML', 'Canvas'],
-    
-    /** 
+
+    /**
      * Property: renderer
      * {<OpenLayers.Renderer>}
      */
     renderer: null,
-    
+
     /**
      * APIProperty: rendererOptions
      * {Object} Options for the renderer. See {<OpenLayers.Renderer>} for
      *     supported options.
      */
     rendererOptions: null,
-    
-    /** 
+
+    /**
      * APIProperty: geometryType
      * {String} geometryType allows you to limit the types of geometries this
      * layer supports. This should be set to something like
@@ -32098,7 +32118,7 @@
      */
     geometryType: null,
 
-    /** 
+    /**
      * Property: drawn
      * {Boolean} Whether the Vector Layer features have been drawn yet.
      */
@@ -32117,7 +32137,7 @@
      * {<OpenLayers.Layer.Vector>} A new vector layer
      */
     initialize: function(name, options) {
-        
+
         // concatenate events specific to vector with those from the base
         this.EVENT_TYPES =
             OpenLayers.Layer.Vector.prototype.EVENT_TYPES.concat(
@@ -32127,7 +32147,7 @@
         OpenLayers.Layer.prototype.initialize.apply(this, arguments);
 
         // allow user-set renderer, otherwise assign one
-        if (!this.renderer || !this.renderer.supported()) {  
+        if (!this.renderer || !this.renderer.supported()) {
             this.assignRenderer();
         }
 
@@ -32135,7 +32155,7 @@
         if (!this.renderer || !this.renderer.supported()) {
             this.renderer = null;
             this.displayError();
-        } 
+        }
 
         if (!this.styleMap) {
             this.styleMap = new OpenLayers.StyleMap();
@@ -32144,7 +32164,7 @@
         this.features = [];
         this.selectedFeatures = [];
         this.unrenderedFeatures = {};
-        
+
         // Allow for custom layer behavior
         if(this.strategies){
             for(var i=0, len=this.strategies.length; i<len; i++) {
@@ -32185,7 +32205,7 @@
         this.renderer = null;
         this.geometryType = null;
         this.drawn = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments);  
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
 
     /**
@@ -32203,11 +32223,11 @@
         }
     },
 
-    /** 
+    /**
      * Method: assignRenderer
-     * Iterates through the available renderer implementations and selects 
+     * Iterates through the available renderer implementations and selects
      * and assigns the first one whose "supported()" function returns true.
-     */    
+     */
     assignRenderer: function()  {
         for (var i=0, len=this.renderers.length; i<len; i++) {
             var rendererClass = OpenLayers.Renderer[this.renderers[i]];
@@ -32215,32 +32235,32 @@
                 this.renderer = new rendererClass(this.div,
                     this.rendererOptions);
                 break;
-            }  
-        }  
+            }
+        }
     },
 
-    /** 
-     * Method: displayError 
+    /**
+     * Method: displayError
      * Let the user know their browser isn't supported.
      */
     displayError: function() {
         if (this.reportError) {
-            OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported", 
+            OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported",
                                      {'renderers':this.renderers.join("\n")}));
-        }    
+        }
     },
 
-    /** 
+    /**
      * Method: setMap
-     * The layer has been added to the map. 
-     * 
+     * The layer has been added to the map.
+     *
      * If there is no renderer set, the layer can't be used. Remove it.
      * Otherwise, give the renderer a reference to the map and set its size.
-     * 
+     *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
-    setMap: function(map) {        
+    setMap: function(map) {
         OpenLayers.Layer.prototype.setMap.apply(this, arguments);
 
         if (!this.renderer) {
@@ -32287,11 +32307,11 @@
             }
         }
     },
-    
+
     /**
      * Method: onMapResize
-     * Notify the renderer of the change in size. 
-     * 
+     * Notify the renderer of the change in size.
+     *
      */
     onMapResize: function() {
         OpenLayers.Layer.prototype.onMapResize.apply(this, arguments);
@@ -32300,32 +32320,32 @@
 
     /**
      * Method: moveTo
-     *  Reset the vector layer's div so that it once again is lined up with 
+     *  Reset the vector layer's div so that it once again is lined up with
      *   the map. Notify the renderer of the change of extent, and in the
-     *   case of a change of zoom level (resolution), have the 
+     *   case of a change of zoom level (resolution), have the
      *   renderer redraw features.
-     * 
-     *  If the layer has not yet been drawn, cycle through the layer's 
+     *
+     *  If the layer has not yet been drawn, cycle through the layer's
      *   features and draw each one.
-     * 
+     *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * zoomChanged - {Boolean} 
-     * dragging - {Boolean} 
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
      */
     moveTo: function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
-        
+
         var coordSysUnchanged = true;
 
         if (!dragging) {
             this.renderer.root.style.visibility = "hidden";
-            
+
             this.div.style.left = -parseInt(this.map.layerContainerDiv.style.left) + "px";
             this.div.style.top = -parseInt(this.map.layerContainerDiv.style.top) + "px";
             var extent = this.map.getExtent();
             coordSysUnchanged = this.renderer.setExtent(extent, zoomChanged);
-            
+
             this.renderer.root.style.visibility = "visible";
 
             // Force a reflow on gecko based browsers to prevent jump/flicker.
@@ -32334,7 +32354,7 @@
             if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) {
                 this.div.scrollLeft = this.div.scrollLeft;
             }
-            
+
             if(!zoomChanged && coordSysUnchanged) {
                 for(var i in this.unrenderedFeatures) {
                     var feature = this.unrenderedFeatures[i];
@@ -32342,7 +32362,7 @@
                 }
             }
         }
-        
+
         if (!this.drawn || zoomChanged || !coordSysUnchanged) {
             this.drawn = true;
             var feature;
@@ -32351,13 +32371,13 @@
                 feature = this.features[i];
                 this.drawFeature(feature);
             }
-        }    
+        }
     },
-    
-    /** 
+
+    /**
      * APIMethod: display
      * Hide or show the Layer
-     * 
+     *
      * Parameters:
      * display - {Boolean}
      */
@@ -32376,14 +32396,14 @@
      * Add Features to the layer.
      *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      * options - {Object}
      */
     addFeatures: function(features, options) {
         if (!(features instanceof Array)) {
             features = [features];
         }
-        
+
         var notify = !options || !options.silent;
         if(notify) {
             var event = {features: features};
@@ -32393,16 +32413,16 @@
             }
             features = event.features;
         }
-        
 
+
         for (var i=0, len=features.length; i<len; i++) {
             if (i != (features.length - 1)) {
                 this.renderer.locked = true;
             } else {
                 this.renderer.locked = false;
-            }    
+            }
             var feature = features[i];
-            
+
             if (this.geometryType &&
               !(feature.geometry instanceof this.geometryType)) {
                 var throwStr = OpenLayers.i18n('componentShouldBe',
@@ -32411,7 +32431,7 @@
               }
 
             this.features.push(feature);
-            
+
             //give feature reference to its layer
             feature.layer = this;
 
@@ -32428,7 +32448,7 @@
             }
 
             this.drawFeature(feature);
-            
+
             if (notify) {
                 this.events.triggerEvent("featureadded", {
                     feature: feature
@@ -32436,7 +32456,7 @@
                 this.onFeatureInsert(feature);
             }
         }
-        
+
         if(notify) {
             this.events.triggerEvent("featuresadded", {features: features});
         }
@@ -32450,7 +32470,7 @@
      *     and featureremoved events will be triggered for each feature.  The
      *     featuresremoved event will be triggered after all features have
      *     been removed.  To supress event triggering, use the silent option.
-     * 
+     *
      * Parameters:
      * features - {Array(<OpenLayers.Feature.Vector>)} List of features to be
      *     removed.
@@ -32479,15 +32499,15 @@
             // because if all the features after the current one are 'null', we
             // won't call eraseGeometry, so we break the 'renderer functions
             // will always be called with locked=false *last*' rule. The end result
-            // is a possible gratiutious unlocking to save a loop through the rest 
+            // is a possible gratiutious unlocking to save a loop through the rest
             // of the list checking the remaining features every time. So long as
-            // null geoms are rare, this is probably okay.    
+            // null geoms are rare, this is probably okay.
             if (i != 0 && features[i-1].geometry) {
                 this.renderer.locked = true;
             } else {
                 this.renderer.locked = false;
             }
-    
+
             var feature = features[i];
             delete this.unrenderedFeatures[feature.id];
 
@@ -32504,8 +32524,8 @@
             if (feature.geometry) {
                 this.renderer.eraseFeatures(feature);
             }
-                    
-            //in the case that this feature is one of the selected features, 
+
+            //in the case that this feature is one of the selected features,
             // remove it from that array as well.
             if (OpenLayers.Util.indexOf(this.selectedFeatures, feature) != -1){
                 OpenLayers.Util.removeItem(this.selectedFeatures, feature);
@@ -32553,20 +32573,20 @@
      * is included, this style will be used.  If no style is included, the
      * feature's style will be used.  If the feature doesn't have a style,
      * the layer's style will be used.
-     * 
-     * This function is not designed to be used when adding features to 
+     *
+     * This function is not designed to be used when adding features to
      * the layer (use addFeatures instead). It is meant to be used when
-     * the style of a feature has changed, or in some other way needs to 
+     * the style of a feature has changed, or in some other way needs to
      * visually updated *after* it has already been added to a layer. You
-     * must add the feature to the layer for most layer-related events to 
+     * must add the feature to the layer for most layer-related events to
      * happen.
      *
-     * Parameters: 
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
      * style - {Object} Symbolizer hash or {String} renderIntent
      */
     drawFeature: function(feature, style) {
-        // don't try to draw the feature with the renderer if the layer is not 
+        // don't try to draw the feature with the renderer if the layer is not
         // drawn itself
         if (!this.drawn) {
             return
@@ -32581,20 +32601,20 @@
                 style = this.styleMap.createSymbolizer(feature, renderIntent);
             }
         }
-        
+
         if (!this.renderer.drawFeature(feature, style)) {
             this.unrenderedFeatures[feature.id] = feature;
         } else {
             delete this.unrenderedFeatures[feature.id];
         };
     },
-    
+
     /**
      * Method: eraseFeatures
      * Erase features from the layer.
      *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         this.renderer.eraseFeatures(features);
@@ -32606,26 +32626,26 @@
      * Otherwise, return null.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {<OpenLayers.Feature.Vector>} A feature if one was under the event.
      */
     getFeatureFromEvent: function(evt) {
         if (!this.renderer) {
-            OpenLayers.Console.error(OpenLayers.i18n("getFeatureError")); 
+            OpenLayers.Console.error(OpenLayers.i18n("getFeatureError"));
             return null;
-        }    
+        }
         var featureId = this.renderer.getFeatureIdFromEvent(evt);
         return this.getFeatureById(featureId);
     },
-    
+
     /**
      * APIMethod: getFeatureById
      * Given a feature id, return the feature if it exists in the features array
      *
      * Parameters:
-     * featureId - {String} 
+     * featureId - {String}
      *
      * Returns:
      * {<OpenLayers.Feature.Vector>} A feature corresponding to the given
@@ -32642,7 +32662,7 @@
         }
         return feature;
     },
-    
+
     /**
      * Unselect the selected features
      * i.e. clears the featureSelection array
@@ -32665,12 +32685,12 @@
      * Does nothing by default. Override this if you
      * need to do something on feature updates.
      *
-     * Paarameters: 
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * Paarameters:
+     * feature - {<OpenLayers.Feature.Vector>}
      */
     onFeatureInsert: function(feature) {
     },
-    
+
     /**
      * APIMethod: preFeatureInsert
      * method called before a feature is inserted.
@@ -32679,15 +32699,15 @@
      * layer, but before they are drawn, such as adjust the style.
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * feature - {<OpenLayers.Feature.Vector>}
      */
     preFeatureInsert: function(feature) {
     },
 
-    /** 
+    /**
      * APIMethod: getDataExtent
      * Calculates the max extent which includes all of the features.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -32744,13 +32764,13 @@
      * Create a new MultiPoint Geometry
      *
      * Parameters:
-     * components - {Array(<OpenLayers.Geometry.Point>)} 
+     * components - {Array(<OpenLayers.Geometry.Point>)}
      *
      * Returns:
      * {<OpenLayers.Geometry.MultiPoint>}
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -32765,7 +32785,7 @@
     addPoint: function(point, index) {
         this.addComponent(point, index);
     },
-    
+
     /**
      * APIMethod: removePoint
      * Wrapper for <OpenLayers.Geometry.Collection.removeComponent>
@@ -32801,12 +32821,12 @@
  *     called with each change in the sketch and will receive the latest point
  *     drawn.  Create a new instance with the <OpenLayers.Handler.Point>
  *     constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
-    
+
     /**
      * Property: point
      * {<OpenLayers.Feature.Vector>} The currently drawn point
@@ -32818,20 +32838,20 @@
      * {<OpenLayers.Layer.Vector>} The temporary drawing layer
      */
     layer: null,
-    
+
     /**
      * Property: multi
      * {Boolean} Cast features to multi-part geometries before passing to the
      *     layer.  Default is false.
      */
     multi: false,
-    
+
     /**
-     * Property: drawing 
+     * Property: drawing
      * {Boolean} A point is being drawn
      */
     drawing: false,
-    
+
     /**
      * Property: mouseDown
      * {Boolean} The mouse is down
@@ -32893,7 +32913,7 @@
 
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: activate
      * turn on the handler
@@ -32916,7 +32936,7 @@
         this.map.addLayer(this.layer);
         return true;
     },
-    
+
     /**
      * Method: createFeature
      * Add temporary features
@@ -32958,7 +32978,7 @@
         this.layer = null;
         return true;
     },
-    
+
     /**
      * Method: destroyFeature
      * Destroy the temporary geometries
@@ -33002,11 +33022,11 @@
      * Method: click
      * Handle clicks.  Clicks are stopped from propagating to other listeners
      *     on map.events or other dom elements.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     click: function(evt) {
@@ -33018,18 +33038,18 @@
      * Method: dblclick
      * Handle double-clicks.  Double-clicks are stopped from propagating to other
      *     listeners on map.events or other dom elements.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     dblclick: function(evt) {
         OpenLayers.Event.stop(evt);
         return false;
     },
-    
+
     /**
      * Method: modifyFeature
      * Modify the existing geometry given a pixel location.
@@ -33053,7 +33073,7 @@
     drawFeature: function() {
         this.layer.drawFeature(this.point, this.style);
     },
-    
+
     /**
      * Method: getGeometry
      * Return the sketch geometry.  If <multi> is true, this will return
@@ -33081,16 +33101,16 @@
         var geom = this.getGeometry();
         return geom && geom.clone();
     },
-  
+
     /**
      * Method: mousedown
      * Handle mouse down.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousedown: function(evt) {
@@ -33119,11 +33139,11 @@
      * Method: mousemove
      * Handle mouse move.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
@@ -33141,7 +33161,7 @@
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mouseup: function (evt) {
@@ -33169,37 +33189,37 @@
 
 /**
  * Class: OpenLayers.Geometry.Curve
- * A Curve is a MultiPoint, whose points are assumed to be connected. To 
- * this end, we provide a "getLength()" function, which iterates through 
- * the points, summing the distances between them. 
- * 
- * Inherits: 
+ * A Curve is a MultiPoint, whose points are assumed to be connected. To
+ * this end, we provide a "getLength()" function, which iterates through
+ * the points, summing the distances between them.
+ *
+ * Inherits:
  *  - <OpenLayers.Geometry.MultiPoint>
  */
 OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
 
     /**
      * Property: componentTypes
-     * {Array(String)} An array of class names representing the types of 
-     *                 components that the collection can include.  A null 
+     * {Array(String)} An array of class names representing the types of
+     *                 components that the collection can include.  A null
      *                 value means the component types are not restricted.
      */
     componentTypes: ["OpenLayers.Geometry.Point"],
 
     /**
      * Constructor: OpenLayers.Geometry.Curve
-     * 
+     *
      * Parameters:
      * point - {Array(<OpenLayers.Geometry.Point>)}
      */
     initialize: function(points) {
-        OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this,
                                                                   arguments);
     },
-    
+
     /**
      * APIMethod: getLength
-     * 
+     *
      * Returns:
      * {Float} The length of the curve
      */
@@ -33221,7 +33241,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Returns:
      * {Float} The appoximate geodesic length of the geometry in meters.
      */
@@ -33265,9 +33285,9 @@
 
 /**
  * Class: OpenLayers.Geometry.LineString
- * A LineString is a Curve which, once two points have been added to it, can 
+ * A LineString is a Curve which, once two points have been added to it, can
  * never be less than two points long.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Curve>
  */
@@ -33283,24 +33303,24 @@
      *
      */
     initialize: function(points) {
-        OpenLayers.Geometry.Curve.prototype.initialize.apply(this, arguments);        
+        OpenLayers.Geometry.Curve.prototype.initialize.apply(this, arguments);
     },
 
     /**
      * APIMethod: removeComponent
-     * Only allows removal of a point if there are three or more points in 
+     * Only allows removal of a point if there are three or more points in
      * the linestring. (otherwise the result would be just a single point)
      *
-     * Parameters: 
+     * Parameters:
      * point - {<OpenLayers.Geometry.Point>} The point to be removed
      */
     removeComponent: function(point) {
         if ( this.components && (this.components.length > 2)) {
-            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
                                                                   arguments);
         }
     },
-    
+
     /**
      * APIMethod: intersects
      * Test for instersection between two geometries.  This is a cheapo
@@ -33372,7 +33392,7 @@
         }
         return intersect;
     },
-    
+
     /**
      * Method: getSortedSegments
      *
@@ -33410,7 +33430,7 @@
         }
         return segments.sort(byX1);
     },
-    
+
     /**
      * Method: splitWithSegment
      * Split this geometry with the given segment.
@@ -33507,7 +33527,7 @@
     /**
      * Method: split
      * Use this geometry (the source) to attempt to split a target geometry.
-     * 
+     *
      * Parameters:
      * target - {<OpenLayers.Geometry>} The target geometry.
      * options - {Object} Properties of this object will be used to determine
@@ -33522,7 +33542,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -33626,7 +33646,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -33732,7 +33752,7 @@
             } else {
                 best = best.distance;
             }
-        } else if(geometry instanceof OpenLayers.Geometry.LineString) { 
+        } else if(geometry instanceof OpenLayers.Geometry.LineString) {
             var segs0 = this.getSortedSegments();
             var segs1 = geometry.getSortedSegments();
             var seg0, seg1, intersection, x0, y0;
@@ -33820,14 +33840,14 @@
 
 /**
  * Class: OpenLayers.Geometry.LinearRing
- * 
- * A Linear Ring is a special LineString which is closed. It closes itself 
+ *
+ * A Linear Ring is a special LineString which is closed. It closes itself
  * automatically on every addPoint/removePoint by adding a copy of the first
- * point as the last point. 
- * 
+ * point as the last point.
+ *
  * Also, as it is the first in the line family to close itself, a getArea()
  * function is defined to calculate the enclosed area of the linearRing
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Geometry.LineString>
  */
@@ -33836,8 +33856,8 @@
 
     /**
      * Property: componentTypes
-     * {Array(String)} An array of class names representing the types of 
-     *                 components that the collection can include.  A null 
+     * {Array(String)} An array of class names representing the types of
+     *                 components that the collection can include.  A null
      *                 value means the component types are not restricted.
      */
     componentTypes: ["OpenLayers.Geometry.Point"],
@@ -33849,12 +33869,12 @@
      *     point does not equal the first point), the constructor will close
      *     the ring.  If the ring is already closed (the last point does equal
      *     the first point), it will be left closed.
-     * 
+     *
      * Parameters:
      * points - {Array(<OpenLayers.Geometry.Point>)} points
      */
     initialize: function(points) {
-        OpenLayers.Geometry.LineString.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.LineString.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -33862,16 +33882,16 @@
      * APIMethod: addComponent
      * Adds a point to geometry components.  If the point is to be added to
      *     the end of the components array and it is the same as the last point
-     *     already in that array, the duplicate point is not added.  This has 
-     *     the effect of closing the ring if it is not already closed, and 
-     *     doing the right thing if it is already closed.  This behavior can 
-     *     be overridden by calling the method with a non-null index as the 
+     *     already in that array, the duplicate point is not added.  This has
+     *     the effect of closing the ring if it is not already closed, and
+     *     doing the right thing if it is already closed.  This behavior can
+     *     be overridden by calling the method with a non-null index as the
      *     second argument.
      *
      * Parameter:
      * point - {<OpenLayers.Geometry.Point>}
      * index - {Integer} Index into the array to insert the component
-     * 
+     *
      * Returns:
      * {Boolean} Was the Point successfully added?
      */
@@ -33884,18 +33904,18 @@
         // given an index, add the point
         // without an index only add non-duplicate points
         if(index != null || !point.equals(lastPoint)) {
-            added = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+            added = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                     arguments);
         }
 
         //append copy of first point
         var firstPoint = this.components[0];
-        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                 [firstPoint]);
-        
+
         return added;
     },
-    
+
     /**
      * APIMethod: removeComponent
      * Removes a point from geometry components.
@@ -33908,17 +33928,17 @@
 
             //remove last point
             this.components.pop();
-            
+
             //remove our point
-            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
                                                                     arguments);
             //append copy of first point
             var firstPoint = this.components[0];
-            OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                 [firstPoint]);
         }
     },
-    
+
     /**
      * APIMethod: move
      * Moves a geometry by the given displacement along positive x and y axes.
@@ -33926,7 +33946,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -33962,9 +33982,9 @@
      *                 will have four times the area).
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         for(var i=0, len=this.components.length; i<len - 1; ++i) {
@@ -33972,7 +33992,7 @@
         }
         return this;
     },
-    
+
     /**
      * APIMethod: transform
      * Reproject the components geometry from source to dest.
@@ -33980,9 +34000,9 @@
      * Parameters:
      * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if (source && dest) {
@@ -33994,7 +34014,7 @@
         }
         return this;
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -34022,7 +34042,7 @@
      * APIMethod: getArea
      * Note - The area is positive if the ring is oriented CW, otherwise
      *         it will be negative.
-     * 
+     *
      * Returns:
      * {Float} The signed area for a ring.
      */
@@ -34039,7 +34059,7 @@
         }
         return area;
     },
-    
+
     /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
@@ -34050,7 +34070,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -34083,7 +34103,7 @@
         }
         return area;
     },
-    
+
     /**
      * Method: containsPoint
      * Test if a point is inside a linear ring.  For the case where a point
@@ -34115,7 +34135,7 @@
             end = this.components[i + 1];
             x2 = approx(end.x, digs);
             y2 = approx(end.y, digs);
-            
+
             /**
              * The following conditions enforce five edge-crossing rules:
              *    1. points coincident with edges are considered contained;
@@ -34241,10 +34261,10 @@
  * Class: OpenLayers.Geometry.MultiLineString
  * A MultiLineString is a geometry with multiple <OpenLayers.Geometry.LineString>
  * components.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Collection>
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.MultiLineString = OpenLayers.Class(
   OpenLayers.Geometry.Collection, {
@@ -34261,19 +34281,19 @@
      * Constructor: OpenLayers.Geometry.MultiLineString
      * Constructor for a MultiLineString Geometry.
      *
-     * Parameters: 
-     * components - {Array(<OpenLayers.Geometry.LineString>)} 
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry.LineString>)}
      *
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
-                                                                  arguments);        
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
+                                                                  arguments);
     },
-    
+
     /**
      * Method: split
      * Use this geometry (the source) to attempt to split a target geometry.
-     * 
+     *
      * Parameters:
      * target - {<OpenLayers.Geometry>} The target geometry.
      * options - {Object} Properties of this object will be used to determine
@@ -34288,7 +34308,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -34308,7 +34328,7 @@
         for(var i=0, len=this.components.length; i<len; ++i) {
             sourceLine = this.components[i];
             sourceSplit = false;
-            for(var j=0; j < targetParts.length; ++j) { 
+            for(var j=0; j < targetParts.length; ++j) {
                 splits = sourceLine.split(targetParts[j], options);
                 if(splits) {
                     if(mutual) {
@@ -34373,7 +34393,7 @@
         }
         return results;
     },
-    
+
     /**
      * Method: splitWith
      * Split this geometry (the target) with the given geometry (the source).
@@ -34393,7 +34413,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -34443,7 +34463,7 @@
                                 );
                             }
                         }
-                        targetSplit = true;                    
+                        targetSplit = true;
                     }
                 }
                 if(!targetSplit) {
@@ -34461,7 +34481,7 @@
                             ])
                         ];
                     }
-                    
+
                 }
             }
         } else {
@@ -34513,13 +34533,13 @@
  *  - <OpenLayers.Handler.Point>
  */
 OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
-    
+
     /**
      * Property: line
      * {<OpenLayers.Feature.Vector>}
      */
     line: null,
-    
+
     /**
      * Property: freehand
      * {Boolean} In freehand mode, the handler starts the path on mouse down,
@@ -34528,7 +34548,7 @@
      * click and double-click finishes the path.
      */
     freehand: false,
-    
+
     /**
      * Property: freehandToggle
      * {String} If set, freehandToggle is checked on mouse events and will set
@@ -34563,7 +34583,7 @@
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.Point.prototype.initialize.apply(this, arguments);
     },
-        
+
     /**
      * Method: createFeature
      * Add temporary geometries
@@ -34584,7 +34604,7 @@
         this.point.geometry.clearBounds();
         this.layer.addFeatures([this.line, this.point], {silent: true});
     },
-        
+
     /**
      * Method: destroyFeature
      * Destroy temporary geometries
@@ -34603,7 +34623,7 @@
             this.layer.removeFeatures([this.point]);
         }
     },
-    
+
     /**
      * Method: addPoint
      * Add point to geometry.  Send the point index to override
@@ -34625,7 +34645,7 @@
         this.callback("modify", [this.point.geometry, this.getSketch()]);
         this.drawFeature();
     },
-    
+
     /**
      * Method: freehandMode
      * Determine whether to behave in freehand mode or not.
@@ -34695,11 +34715,11 @@
      * Method: mousedown
      * Handle mouse down.  Add a new point to the geometry and
      * render it. Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousedown: function(evt) {
@@ -34725,15 +34745,15 @@
      * Method: mousemove
      * Handle mouse move.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
-        if(this.drawing) { 
+        if(this.drawing) {
             if(this.mouseDown && this.freehandMode(evt)) {
                 this.addPoint(evt.xy);
             } else {
@@ -34742,16 +34762,16 @@
         }
         return true;
     },
-    
+
     /**
      * Method: mouseup
      * Handle mouse up.  Send the latest point in the geometry to
      * the control. Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mouseup: function (evt) {
@@ -34770,16 +34790,16 @@
         }
         return true;
     },
-  
+
     /**
-     * Method: dblclick 
+     * Method: dblclick
      * Handle double-clicks.  Finish the geometry and send it back
      * to the control.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     dblclick: function(evt) {
@@ -34808,12 +34828,12 @@
  */
 
 /**
- * Class: OpenLayers.Geometry.Polygon 
- * Polygon is a collection of Geometry.LinearRings. 
- * 
+ * Class: OpenLayers.Geometry.Polygon
+ * Polygon is a collection of Geometry.LinearRings.
+ *
  * Inherits from:
- *  - <OpenLayers.Geometry.Collection> 
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry.Collection>
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Polygon = OpenLayers.Class(
   OpenLayers.Geometry.Collection, {
@@ -34828,24 +34848,24 @@
 
     /**
      * Constructor: OpenLayers.Geometry.Polygon
-     * Constructor for a Polygon geometry. 
-     * The first ring (this.component[0])is the outer bounds of the polygon and 
+     * Constructor for a Polygon geometry.
+     * The first ring (this.component[0])is the outer bounds of the polygon and
      * all subsequent rings (this.component[1-n]) are internal holes.
      *
      *
      * Parameters:
-     * components - {Array(<OpenLayers.Geometry.LinearRing>)} 
+     * components - {Array(<OpenLayers.Geometry.LinearRing>)}
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
-    
-    /** 
+
+    /**
      * APIMethod: getArea
-     * Calculated by subtracting the areas of the internal holes from the 
+     * Calculated by subtracting the areas of the internal holes from the
      *   area of the outer hole.
-     * 
+     *
      * Returns:
      * {float} The area of the geometry
      */
@@ -34860,7 +34880,7 @@
         return area;
     },
 
-    /** 
+    /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
      *     the earth.
@@ -34869,7 +34889,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -34920,7 +34940,7 @@
                             } else {
                                 // in hole
                                 contained = false;
-                            }                            
+                            }
                             break;
                         }
                     }
@@ -35031,7 +35051,7 @@
 
 /**
  * APIMethod: createRegularPolygon
- * Create a regular polygon around a radius. Useful for creating circles 
+ * Create a regular polygon around a radius. Useful for creating circles
  * and the like.
  *
  * Parameters:
@@ -35040,7 +35060,7 @@
  * sides - {Integer} Number of sides. 20 approximates a circle.
  * rotation - {Float} original angle of rotation, in degrees.
  */
-OpenLayers.Geometry.Polygon.createRegularPolygon = function(origin, radius, sides, rotation) {  
+OpenLayers.Geometry.Polygon.createRegularPolygon = function(origin, radius, sides, rotation) {
     var angle = Math.PI * ((1/sides) - (1/2));
     if(rotation) {
         angle += (rotation / 180) * Math.PI;
@@ -35074,7 +35094,7 @@
  * MultiPolygon is a geometry with multiple <OpenLayers.Geometry.Polygon>
  * components.  Create a new instance with the <OpenLayers.Geometry.MultiPolygon>
  * constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Collection>
  */
@@ -35099,7 +35119,7 @@
      *
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -35129,7 +35149,7 @@
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
-    
+
     /**
      * Parameter: polygon
      * {<OpenLayers.Feature.Vector>}
@@ -35161,7 +35181,7 @@
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.Path.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * Method: createFeature
      * Add temporary geometries
@@ -35203,7 +35223,7 @@
         this.layer.drawFeature(this.polygon, this.style);
         this.layer.drawFeature(this.point, this.style);
     },
-    
+
     /**
      * Method: getSketch
      * Return the sketch feature.
@@ -35235,9 +35255,9 @@
      * Method: dblclick
      * Handle double-clicks.  Finish the geometry and send it back
      * to the control.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     dblclick: function(evt) {
         if(!this.freehandMode(evt)) {
@@ -35276,50 +35296,50 @@
  * Class: OpenLayers.Format.GML
  * Read/Wite GML. Create a new instance with the <OpenLayers.Format.GML>
  *     constructor.  Supports the GML simple features profile.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format.XML, {
-    
+
     /*
      * APIProperty: featureNS
      * {String} Namespace used for feature attributes.  Default is
      *     "http://mapserver.gis.umn.edu/mapserver".
      */
     featureNS: "http://mapserver.gis.umn.edu/mapserver",
-    
+
     /**
      * APIProperty: featurePrefix
      * {String} Namespace alias (or prefix) for feature nodes.  Default is
      *     "feature".
      */
     featurePrefix: "feature",
-    
+
     /*
      * APIProperty: featureName
      * {String} Element name for features. Default is "featureMember".
      */
-    featureName: "featureMember", 
-    
+    featureName: "featureMember",
+
     /*
      * APIProperty: layerName
      * {String} Name of data layer. Default is "features".
      */
     layerName: "features",
-    
+
     /**
      * APIProperty: geometryName
      * {String} Name of geometry element.  Defaults to "geometry".
      */
     geometryName: "geometry",
-    
-    /** 
+
+    /**
      * APIProperty: collectionName
      * {String} Name of featureCollection element.
      */
     collectionName: "FeatureCollection",
-    
+
     /**
      * APIProperty: gmlns
      * {String} GML Namespace.
@@ -35331,14 +35351,14 @@
      * {Boolean} Extract attributes from GML.
      */
     extractAttributes: true,
-    
+
     /**
      * APIProperty: xy
      * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x)
      * Changing is not recommended, a new Format should be instantiated.
-     */ 
+     */
     xy: true,
-    
+
     /**
      * Constructor: OpenLayers.Format.GML
      * Create a new parser for GML.
@@ -35360,8 +35380,8 @@
 
     /**
      * APIMethod: read
-     * Read data from a string, and return a list of features. 
-     * 
+     * Read data from a string, and return a list of features.
+     *
      * Parameters:
      * data - {String} or {DOMElement} data to read/parse.
      *
@@ -35369,7 +35389,7 @@
      * {Array(<OpenLayers.Feature.Vector>)} An array of features.
      */
     read: function(data) {
-        if(typeof data == "string") { 
+        if(typeof data == "string") {
             data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
         }
         var featureNodes = this.getElementsByTagNameNS(data.documentElement,
@@ -35384,15 +35404,15 @@
         }
         return features;
     },
-    
+
     /**
      * Method: parseFeature
      * This function is the core of the GML parsing code in OpenLayers.
      *    It creates the geometries that are then attached to the returned
      *    feature, and calls parseAttributes() to get attribute data out.
-     *    
+     *
      * Parameters:
-     * node - {DOMElement} A GML feature node. 
+     * node - {DOMElement} A GML feature node.
      */
     parseFeature: function(node) {
         // only accept one geometry per feature - look for highest "order"
@@ -35409,9 +35429,9 @@
                 if(parser) {
                     geometry = parser.apply(this, [nodeList[0]]);
                     if (this.internalProjection && this.externalProjection) {
-                        geometry.transform(this.externalProjection, 
-                                           this.internalProjection); 
-                    }                       
+                        geometry.transform(this.externalProjection,
+                                           this.internalProjection);
+                    }
                 } else {
                     OpenLayers.Console.error(OpenLayers.i18n(
                                 "unsupportedGeometryType", {'geomType':type}));
@@ -35420,20 +35440,20 @@
                 break;
             }
         }
-        
+
         // construct feature (optionally with attributes)
         var attributes;
         if(this.extractAttributes) {
             attributes = this.parseAttributes(node);
         }
         var feature = new OpenLayers.Feature.Vector(geometry, attributes);
-        
+
         feature.gml = {
             featureType: node.firstChild.nodeName.split(":")[1],
             featureNS: node.firstChild.namespaceURI,
             featureNSPrefix: node.firstChild.prefix
         };
-                
+
         // assign fid - this can come from a "fid" or "id" attribute
         var childNode = node.firstChild;
         var fid;
@@ -35450,14 +35470,14 @@
         feature.fid = fid;
         return feature;
     },
-    
+
     /**
      * Property: parseGeometry
      * Properties of this object are the functions that parse geometries based
      *     on their type.
      */
     parseGeometry: {
-        
+
         /**
          * Method: parseGeometry.point
          * Given a GML node representing a point geometry, create an OpenLayers
@@ -35514,12 +35534,12 @@
                     }
                 }
             }
-                
+
             // preserve third dimension
             if(coords.length == 2) {
                 coords[2] = null;
             }
-            
+
             if (this.xy) {
                 return new OpenLayers.Geometry.Point(coords[0], coords[1],
                                                  coords[2]);
@@ -35529,7 +35549,7 @@
                                                  coords[2]);
             }
         },
-        
+
         /**
          * Method: parseGeometry.multipoint
          * Given a GML node representing a multipoint geometry, create an
@@ -35556,7 +35576,7 @@
             }
             return new OpenLayers.Geometry.MultiPoint(components);
         },
-        
+
         /**
          * Method: parseGeometry.linestring
          * Given a GML node representing a linestring geometry, create an
@@ -35638,7 +35658,7 @@
             }
             return line;
         },
-        
+
         /**
          * Method: parseGeometry.multilinestring
          * Given a GML node representing a multilinestring geometry, create an
@@ -35666,7 +35686,7 @@
             }
             return new OpenLayers.Geometry.MultiLineString(components);
         },
-        
+
         /**
          * Method: parseGeometry.polygon
          * Given a GML node representing a polygon geometry, create an
@@ -35695,7 +35715,7 @@
             }
             return new OpenLayers.Geometry.Polygon(components);
         },
-        
+
         /**
          * Method: parseGeometry.multipolygon
          * Given a GML node representing a multipolygon geometry, create an
@@ -35723,22 +35743,22 @@
             }
             return new OpenLayers.Geometry.MultiPolygon(components);
         },
-        
+
         envelope: function(node) {
             var components = [];
             var coordString;
             var envelope;
-            
+
             var lpoint = this.getElementsByTagNameNS(node, this.gmlns, "lowerCorner");
             if (lpoint.length > 0) {
                 var coords = [];
-                
+
                 if(lpoint.length > 0) {
                     coordString = lpoint[0].firstChild.nodeValue;
                     coordString = coordString.replace(this.regExes.trimSpace, "");
                     coords = coordString.split(this.regExes.splitSpace);
                 }
-                
+
                 if(coords.length == 2) {
                     coords[2] = null;
                 }
@@ -35748,17 +35768,17 @@
                     var lowerPoint = new OpenLayers.Geometry.Point(coords[1], coords[0],coords[2]);
                 }
             }
-            
+
             var upoint = this.getElementsByTagNameNS(node, this.gmlns, "upperCorner");
             if (upoint.length > 0) {
                 var coords = [];
-                
+
                 if(upoint.length > 0) {
                     coordString = upoint[0].firstChild.nodeValue;
                     coordString = coordString.replace(this.regExes.trimSpace, "");
                     coords = coordString.split(this.regExes.splitSpace);
                 }
-                
+
                 if(coords.length == 2) {
                     coords[2] = null;
                 }
@@ -35768,21 +35788,21 @@
                     var upperPoint = new OpenLayers.Geometry.Point(coords[1], coords[0],coords[2]);
                 }
             }
-            
+
             if (lowerPoint && upperPoint) {
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, lowerPoint.y));
                 components.push(new OpenLayers.Geometry.Point(upperPoint.x, lowerPoint.y));
                 components.push(new OpenLayers.Geometry.Point(upperPoint.x, upperPoint.y));
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, upperPoint.y));
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, lowerPoint.y));
-                
+
                 var ring = new OpenLayers.Geometry.LinearRing(components);
                 envelope = new OpenLayers.Geometry.Polygon([ring]);
             }
-            return envelope; 
+            return envelope;
         }
     },
-    
+
     /**
      * Method: parseAttributes
      *
@@ -35831,11 +35851,11 @@
         }
         return attributes;
     },
-    
+
     /**
      * APIMethod: write
-     * Generate a GML document string given a list of features. 
-     * 
+     * Generate a GML document string given a list of features.
+     *
      * Parameters:
      * features - {Array(<OpenLayers.Feature.Vector>)} List of features to
      *     serialize into a string.
@@ -35855,7 +35875,7 @@
         return OpenLayers.Format.XML.prototype.write.apply(this, [gml]);
     },
 
-    /** 
+    /**
      * Method: createFeatureXML
      * Accept an OpenLayers.Feature.Vector, and build a GML node for it.
      *
@@ -35881,27 +35901,27 @@
         featureContainer.setAttribute("fid", fid);
         featureContainer.appendChild(geomContainer);
         for(var attr in feature.attributes) {
-            var attrText = this.createTextNode(feature.attributes[attr]); 
+            var attrText = this.createTextNode(feature.attributes[attr]);
             var nodename = attr.substring(attr.lastIndexOf(":") + 1);
             var attrContainer = this.createElementNS(this.featureNS,
                                                      this.featurePrefix + ":" +
                                                      nodename);
             attrContainer.appendChild(attrText);
             featureContainer.appendChild(attrContainer);
-        }    
+        }
         featureNode.appendChild(featureContainer);
         return featureNode;
     },
-    
+
     /**
      * APIMethod: buildGeometryNode
      */
     buildGeometryNode: function(geometry) {
         if (this.externalProjection && this.internalProjection) {
             geometry = geometry.clone();
-            geometry.transform(this.internalProjection, 
+            geometry.transform(this.internalProjection,
                                this.externalProjection);
-        }    
+        }
         var className = geometry.CLASS_NAME;
         var type = className.substring(className.lastIndexOf(".") + 1);
         var builder = this.buildGeometry[type.toLowerCase()];
@@ -35934,7 +35954,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multipoint
          * Given an OpenLayers multipoint geometry, create a GML multipoint.
@@ -35949,7 +35969,7 @@
             var gml = this.createElementNS(this.gmlns, "gml:MultiPoint");
             var points = geometry.components;
             var pointMember, pointGeom;
-            for(var i=0; i<points.length; i++) { 
+            for(var i=0; i<points.length; i++) {
                 pointMember = this.createElementNS(this.gmlns,
                                                    "gml:pointMember");
                 pointGeom = this.buildGeometry.point.apply(this,
@@ -35957,9 +35977,9 @@
                 pointMember.appendChild(pointGeom);
                 gml.appendChild(pointMember);
             }
-            return gml;            
+            return gml;
         },
-        
+
         /**
          * Method: buildGeometry.linestring
          * Given an OpenLayers linestring geometry, create a GML linestring.
@@ -35975,7 +35995,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multilinestring
          * Given an OpenLayers multilinestring geometry, create a GML
@@ -36002,7 +36022,7 @@
             }
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.linearring
          * Given an OpenLayers linearring geometry, create a GML linearring.
@@ -36018,7 +36038,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.polygon
          * Given an OpenLayers polygon geometry, create a GML polygon.
@@ -36044,7 +36064,7 @@
             }
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multipolygon
          * Given an OpenLayers multipolygon geometry, create a GML multipolygon.
@@ -36071,7 +36091,7 @@
             return gml;
 
         },
- 
+
         /**
          * Method: buildGeometry.bounds
          * Given an OpenLayers bounds, create a GML box.
@@ -36095,8 +36115,8 @@
      * (code)
      * <gml:coordinates decimal="." cs="," ts=" ">...</gml:coordinates>
      * (end)
-     * Parameters: 
-     * geometry - {<OpenLayers.Geometry>} 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
      *
      * Returns:
      * {XmlNode} created xmlNode
@@ -36116,17 +36136,17 @@
         } else {
             var points = (geometry.components) ? geometry.components : [geometry];
             for(var i=0; i<points.length; i++) {
-                parts.push(points[i].x + "," + points[i].y);                
-            }            
+                parts.push(points[i].x + "," + points[i].y);
+            }
         }
 
         var txtNode = this.createTextNode(parts.join(" "));
         coordinatesNode.appendChild(txtNode);
-        
+
         return coordinatesNode;
     },
 
-    CLASS_NAME: "OpenLayers.Format.GML" 
+    CLASS_NAME: "OpenLayers.Format.GML"
 });
 /* ======================================================================
     OpenLayers/Format/GML/Base.js
@@ -36157,7 +36177,7 @@
  *  - <OpenLayers.Format.XML>
  */
 OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
-    
+
     /**
      * Property: namespaces
      * {Object} Mapping of namespace aliases to namespace URIs.
@@ -36168,7 +36188,7 @@
         xsi: "http://www.w3.org/2001/XMLSchema-instance",
         wfs: "http://www.opengis.net/wfs" // this is a convenience for reading wfs:FeatureCollection
     },
-    
+
     /**
      * Property: defaultPrefix
      */
@@ -36179,13 +36199,13 @@
      * {String} Schema location for a particular minor version.
      */
     schemaLocation: null,
-    
+
     /**
      * APIProperty: featureType
      * {Array(String) or String} The local (without prefix) feature typeName(s).
      */
     featureType: null,
-    
+
     /**
      * APIProperty: featureNS
      * {String} The feature namespace.  Must be set in the options at
@@ -36204,7 +36224,7 @@
      * {Boolean} Extract attributes from GML.  Default is true.
      */
     extractAttributes: true,
-    
+
     /**
      * APIProperty: srsName
      * {String} URI for spatial reference system.  This is optional for
@@ -36218,7 +36238,7 @@
      * APIProperty: xy
      * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x)
      * Changing is not recommended, a new Format should be instantiated.
-     */ 
+     */
     xy: true,
 
     /**
@@ -36257,7 +36277,7 @@
      *     this instance.
      *
      * Valid options properties:
-     * featureType - {Array(String) or String} Local (without prefix) feature 
+     * featureType - {Array(String) or String} Local (without prefix) feature
      *     typeName(s) (required).
      * featureNS - {String} Feature namespace (required).
      * geometryName - {String} Geometry element name.
@@ -36270,7 +36290,7 @@
         }
         this.singleFeatureType = !options || (typeof options.featureType === "string");
     },
-    
+
     /**
      * Method: read
      *
@@ -36282,7 +36302,7 @@
      * {Array(<OpenLayers.Feature.Vector>)} An array of features.
      */
     read: function(data) {
-        if(typeof data == "string") { 
+        if(typeof data == "string") {
             data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
         }
         if(data && data.nodeType == 9) {
@@ -36312,7 +36332,7 @@
         }
         return features;
     },
-    
+
     /**
      * Property: readers
      * Contains public functions, grouped by namespace prefix, that will
@@ -36327,7 +36347,7 @@
                 this.readChildNodes(node, obj);
             },
             "featureMembers": function(node, obj) {
-                this.readChildNodes(node, obj);                
+                this.readChildNodes(node, obj);
             },
             "name": function(node, obj) {
                 obj.name = this.getChildValue(node);
@@ -36465,7 +36485,7 @@
                 // geometry or attributes.
                 var name;
                 var local = node.localName || node.nodeName.split(":").pop();
-                if (!this.singleFeatureType && 
+                if (!this.singleFeatureType &&
                     (OpenLayers.Util.indexOf(this.featureType, local) != -1)) {
                         name = "_typeName";
                 }
@@ -36532,7 +36552,7 @@
             }
         }
     },
-    
+
     /**
      * Method: write
      *
@@ -36560,7 +36580,7 @@
 
         return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
     },
-    
+
     /**
      * Property: writers
      * As a compliment to the readers property, this structure contains public
@@ -36650,7 +36670,7 @@
                     geometry = geometry.clone().transform(
                         this.internalProjection, this.externalProjection
                     );
-                }    
+                }
                 var node = this.createElementNSPlus(
                     "feature:" + this.geometryName
                 );
@@ -36684,7 +36704,7 @@
             }
         }
     },
-    
+
     /**
      * Function: setGeometryTypes
      * Sets the <geometryTypes> mapping.
@@ -36701,7 +36721,7 @@
         };
     },
 
-    CLASS_NAME: "OpenLayers.Format.GML.Base" 
+    CLASS_NAME: "OpenLayers.Format.GML.Base"
 
 });
 /* ======================================================================
@@ -36724,7 +36744,7 @@
  *  - <OpenLayers.Format.GML.Base>
  */
 OpenLayers.Format.GML.v2 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
-    
+
     /**
      * Property: schemaLocation
      * {String} Schema location for a particular minor version.
@@ -36896,9 +36916,9 @@
         "feature": OpenLayers.Format.GML.Base.prototype.writers["feature"],
         "wfs": OpenLayers.Format.GML.Base.prototype.writers["wfs"]
     },
-    
-    CLASS_NAME: "OpenLayers.Format.GML.v2" 
 
+    CLASS_NAME: "OpenLayers.Format.GML.v2"
+
 });
 /* ======================================================================
     OpenLayers/Format/GML/v3.js
@@ -36920,7 +36940,7 @@
  *  - <OpenLayers.Format.GML.Base>
  */
 OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
-    
+
     /**
      * Property: schemaLocation
      * {String} Schema location for a particular minor version.  The writers
@@ -36937,7 +36957,7 @@
      *     instantiation).
      */
     curve: false,
-    
+
     /**
      * Property: multiCurve
      * {Boolean} Write gml:MultiCurve instead of gml:MultiLineString.  Since
@@ -36947,7 +36967,7 @@
      *     instantiation).
      */
     multiCurve: true,
-    
+
     /**
      * Property: surface
      * {Boolean} Write gml:Surface instead of gml:Polygon elements.  This also
@@ -37136,11 +37156,11 @@
                 this.readers.gml.pos.apply(this, [node, obj]);
                 container.points[1] = obj.points[0];
             }
-        }, OpenLayers.Format.GML.Base.prototype.readers["gml"]),            
+        }, OpenLayers.Format.GML.Base.prototype.readers["gml"]),
         "feature": OpenLayers.Format.GML.Base.prototype.readers["feature"],
         "wfs": OpenLayers.Format.GML.Base.prototype.readers["wfs"]
     },
-    
+
     /**
      * Method: write
      *
@@ -37232,7 +37252,7 @@
                 }
                 return this.createElementNSPlus("gml:posList", {
                     value: parts.join(" ")
-                }); 
+                });
             },
             "Surface": function(geometry) {
                 var node = this.createElementNSPlus("gml:Surface");
@@ -37361,7 +37381,7 @@
             "OpenLayers.Geometry.Collection": "GeometryCollection"
         };
     },
-    
-    CLASS_NAME: "OpenLayers.Format.GML.v3" 
 
+    CLASS_NAME: "OpenLayers.Format.GML.v3"
+
 });

Modified: trunk/lib/OpenLayers/OpenLayers.js
===================================================================
--- trunk/lib/OpenLayers/OpenLayers.js	2010-04-15 16:26:04 UTC (rev 2142)
+++ trunk/lib/OpenLayers/OpenLayers.js	2010-04-15 20:04:19 UTC (rev 2143)
@@ -23,23 +23,23 @@
  *
  *--------------------------------------------------------------------------*/
 
-/**  
-*  
+/**
+*
 *  Contains portions of Rico <http://openrico.org/>
-* 
-*  Copyright 2005 Sabre Airline Solutions  
-*  
+*
+*  Copyright 2005 Sabre Airline Solutions
+*
 *  Licensed under the Apache License, Version 2.0 (the "License"); you
 *  may not use this file except in compliance with the License. You
 *  may obtain a copy of the License at
-*  
-*         http://www.apache.org/licenses/LICENSE-2.0  
-*  
+*
+*         http://www.apache.org/licenses/LICENSE-2.0
+*
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 *  implied. See the License for the specific language governing
-*  permissions and limitations under the License. 
+*  permissions and limitations under the License.
 *
 **/
 
@@ -111,11 +111,11 @@
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
 
-/* 
+/*
  * @requires OpenLayers/BaseTypes.js
  * @requires OpenLayers/Lang/en.js
  * @requires OpenLayers/Console.js
- */ 
+ */
 
 (function() {
     /**
@@ -125,13 +125,13 @@
      * case with single file builds.
      */
     var singleFile = (typeof OpenLayers == "object" && OpenLayers.singleFile);
-    
+
     /**
      * Namespace: OpenLayers
      * The OpenLayers object provides a namespace for all things OpenLayers
      */
     window.OpenLayers = {
-        
+
         /**
          * Property: _scriptName
          * {String} Relative path of this script.
@@ -146,9 +146,9 @@
          * {String} Path to this script
          */
         _getScriptLocation: function () {
-            var scriptLocation = "";            
+            var scriptLocation = "";
             var isOL = new RegExp("(^|(.*?\\/))(" + OpenLayers._scriptName + ")(\\?|$)");
-         
+
             var scripts = document.getElementsByTagName('script');
             for (var i=0, len=scripts.length; i<len; i++) {
                 var src = scripts[i].getAttribute('src');
@@ -166,11 +166,11 @@
     /**
      * OpenLayers.singleFile is a flag indicating this file is being included
      * in a Single File Library build of the OpenLayers Library.
-     * 
+     *
      * When we are *not* part of a SFL build we dynamically include the
      * OpenLayers library code.
-     * 
-     * When we *are* part of a SFL build we do not dynamically include the 
+     *
+     * When we *are* part of a SFL build we do not dynamically include the
      * OpenLayers library code as it will be appended at the end of this file.
       */
     if(!singleFile) {
@@ -282,7 +282,7 @@
             "OpenLayers/Geometry/MultiPoint.js",
             "OpenLayers/Geometry/Curve.js",
             "OpenLayers/Geometry/LineString.js",
-            "OpenLayers/Geometry/LinearRing.js",        
+            "OpenLayers/Geometry/LinearRing.js",
             "OpenLayers/Geometry/Polygon.js",
             "OpenLayers/Geometry/MultiLineString.js",
             "OpenLayers/Geometry/MultiPolygon.js",
@@ -382,16 +382,16 @@
         if(docWrite) {
             var allScriptTags = new Array(jsfiles.length);
         }
-        var host = OpenLayers._getScriptLocation() + "lib/";    
+        var host = OpenLayers._getScriptLocation() + "lib/";
         for (var i=0, len=jsfiles.length; i<len; i++) {
             if (docWrite) {
                 allScriptTags[i] = "<script src='" + host + jsfiles[i] +
-                                   "'></script>"; 
+                                   "'></script>";
             } else {
                 var s = document.createElement("script");
                 s.src = host + jsfiles[i];
-                var h = document.getElementsByTagName("head").length ? 
-                           document.getElementsByTagName("head")[0] : 
+                var h = document.getElementsByTagName("head").length ?
+                           document.getElementsByTagName("head")[0] :
                            document.body;
                 h.appendChild(s);
             }
@@ -423,7 +423,7 @@
  */
 OpenLayers.Util = {};
 
-/** 
+/**
  * Function: getElement
  * This is the old $() from prototype
  */
@@ -443,7 +443,7 @@
     return elements;
 };
 
-/** 
+/**
  * Maintain existing definition of $.
  */
 if(typeof window.$  === "undefined") {
@@ -497,7 +497,7 @@
 };
 
 
-/** 
+/**
  * Function: removeItem
  * Remove an object from an array. Iterates through the array
  *     to find the item, then removes it.
@@ -505,7 +505,7 @@
  * Parameters:
  * array - {Array}
  * item - {Object}
- * 
+ *
  * Return
  * {Array} A reference to the array
  */
@@ -523,7 +523,7 @@
  * Function: clearArray
  * *Deprecated*. This function will disappear in 3.0.
  * Please use "array.length = 0" instead.
- * 
+ *
  * Parameters:
  * array - {Array}
  */
@@ -536,14 +536,14 @@
     array.length = 0;
 };
 
-/** 
+/**
  * Function: indexOf
  * Seems to exist already in FF, but not in MOZ.
- * 
+ *
  * Parameters:
  * array - {Array}
  * obj - {Object}
- * 
+ *
  * Returns:
  * {Integer} The index at, which the object was found in the array.
  *           If not found, returns -1.
@@ -555,29 +555,29 @@
             return i;
         }
     }
-    return -1;   
+    return -1;
 };
 
 
 
 /**
  * Function: modifyDOMElement
- * 
- * Modifies many properties of a DOM element all at once.  Passing in 
+ *
+ * Modifies many properties of a DOM element all at once.  Passing in
  * null to an individual parameter will avoid setting the attribute.
  *
  * Parameters:
  * id - {String} The element id attribute to set.
  * px - {<OpenLayers.Pixel>} The left and top style position.
  * sz - {<OpenLayers.Size>}  The width and height style attributes.
- * position - {String}       The position attribute.  eg: absolute, 
+ * position - {String}       The position attribute.  eg: absolute,
  *                           relative, etc.
  * border - {String}         The style.border attribute.  eg:
  *                           solid black 2px
- * overflow - {String}       The style.overview attribute.  
+ * overflow - {String}       The style.overview attribute.
  * opacity - {Float}         Fractional value (0.0 - 1.0)
  */
-OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, 
+OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position,
                                             border, overflow, opacity) {
 
     if (id) {
@@ -609,32 +609,32 @@
     }
 };
 
-/** 
+/**
  * Function: createDiv
  * Creates a new div and optionally set some standard attributes.
  * Null may be passed to each parameter if you do not wish to
  * set a particular attribute.
  * Note - zIndex is NOT set on the resulting div.
- * 
+ *
  * Parameters:
  * id - {String} An identifier for this element.  If no id is
- *               passed an identifier will be created 
+ *               passed an identifier will be created
  *               automatically.
- * px - {<OpenLayers.Pixel>} The element left and top position. 
+ * px - {<OpenLayers.Pixel>} The element left and top position.
  * sz - {<OpenLayers.Size>} The element width and height.
- * imgURL - {String} A url pointing to an image to use as a 
+ * imgURL - {String} A url pointing to an image to use as a
  *                   background image.
  * position - {String} The style.position value. eg: absolute,
  *                     relative etc.
- * border - {String} The the style.border value. 
+ * border - {String} The the style.border value.
  *                   eg: 2px solid black
  * overflow - {String} The style.overflow value. Eg. hidden
  * opacity - {Float} Fractional value (0.0 - 1.0)
- * 
- * Returns: 
+ *
+ * Returns:
  * {DOMElement} A DOM Div created with the specified attributes.
  */
-OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, 
+OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position,
                                      border, overflow, opacity) {
 
     var dom = document.createElement('div');
@@ -650,7 +650,7 @@
     if (!position) {
         position = "absolute";
     }
-    OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position, 
+    OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position,
                                      border, overflow, opacity);
 
     return dom;
@@ -659,7 +659,7 @@
 /**
  * Function: createImage
  * Creates an img element with specific attribute values.
- *  
+ *
  * Parameters:
  * id - {String} The id field for the img.  If none assigned one will be
  *               automatically generated.
@@ -671,7 +671,7 @@
  * opacity - {Float} Fractional value (0.0 - 1.0)
  * delayDisplay - {Boolean} If true waits until the image has been
  *                          loaded.
- * 
+ *
  * Returns:
  * {DOMElement} A DOM Image created with the specified attributes.
  */
@@ -687,18 +687,18 @@
     if (!position) {
         position = "relative";
     }
-    OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, 
+    OpenLayers.Util.modifyDOMElement(image, id, px, sz, position,
                                      border, null, opacity);
 
     if(delayDisplay) {
         image.style.display = "none";
-        OpenLayers.Event.observe(image, "load", 
+        OpenLayers.Event.observe(image, "load",
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoad, image));
-        OpenLayers.Event.observe(image, "error", 
+        OpenLayers.Event.observe(image, "error",
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, image));
-        
+
     }
-    
+
     //set special properties
     image.style.alt = id;
     image.galleryImg = "no";
@@ -707,17 +707,17 @@
     }
 
 
-        
+
     return image;
 };
 
 /**
  * Function: setOpacity
- * *Deprecated*.  This function has been deprecated. Instead, please use 
- *     <OpenLayers.Util.modifyDOMElement> 
- *     or 
+ * *Deprecated*.  This function has been deprecated. Instead, please use
+ *     <OpenLayers.Util.modifyDOMElement>
+ *     or
  *     <OpenLayers.Util.modifyAlphaImageDiv>
- * 
+ *
  * Set the opacity of a DOM Element
  *     Note that for this function to work in IE, elements must "have layout"
  *     according to:
@@ -739,23 +739,23 @@
  */
 OpenLayers.Util.onImageLoad = function() {
     // The complex check here is to solve issues described in #480.
-    // Every time a map view changes, it increments the 'viewRequestID' 
+    // Every time a map view changes, it increments the 'viewRequestID'
     // property. As the requests for the images for the new map view are sent
-    // out, they are tagged with this unique viewRequestID. 
-    // 
-    // If an image has no viewRequestID property set, we display it regardless, 
-    // but if it does have a viewRequestID property, we check that it matches 
+    // out, they are tagged with this unique viewRequestID.
+    //
+    // If an image has no viewRequestID property set, we display it regardless,
+    // but if it does have a viewRequestID property, we check that it matches
     // the viewRequestID set on the map.
-    // 
+    //
     // If the viewRequestID on the map has changed, that means that the user
     // has changed the map view since this specific request was sent out, and
     // therefore this tile does not need to be displayed (so we do not execute
     // this code that turns its display on).
     //
     if (!this.viewRequestID ||
-        (this.map && this.viewRequestID == this.map.viewRequestID)) { 
+        (this.map && this.viewRequestID == this.map.viewRequestID)) {
         this.style.backgroundColor ="transparent";
-        this.style.display = "";  
+        this.style.display = "";
     }
 };
 
@@ -774,7 +774,7 @@
 OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0;
 
 /**
- * Function: onImageLoadError 
+ * Function: onImageLoadError
  */
 OpenLayers.Util.onImageLoadError = function() {
     this._attempts = (this._attempts) ? (this._attempts + 1) : 1;
@@ -816,7 +816,7 @@
  * Checks whether it's necessary (and possible) to use the png alpha
  * hack which allows alpha transparency for png images under Internet
  * Explorer.
- * 
+ *
  * Returns:
  * {Boolean} true if the png alpha hack is necessary and possible, false otherwise.
  */
@@ -825,25 +825,25 @@
         var arVersion = navigator.appVersion.split("MSIE");
         var version = parseFloat(arVersion[1]);
         var filter = false;
-    
-        // IEs4Lin dies when trying to access document.body.filters, because 
+
+        // IEs4Lin dies when trying to access document.body.filters, because
         // the property is there, but requires a DLL that can't be provided. This
         // means that we need to wrap this in a try/catch so that this can
         // continue.
-    
-        try { 
+
+        try {
             filter = !!(document.body.filters);
-        } catch (e) {}    
-    
-        OpenLayers.Util.alphaHackNeeded = (filter && 
+        } catch (e) {}
+
+        OpenLayers.Util.alphaHackNeeded = (filter &&
                                            (version >= 5.5) && (version < 7));
     }
     return OpenLayers.Util.alphaHackNeeded;
 };
 
-/** 
+/**
  * Function: modifyAlphaImageDiv
- * 
+ *
  * div - {DOMElement} Div containing Alpha-adjusted Image
  * id - {String}
  * px - {<OpenLayers.Pixel>}
@@ -853,9 +853,9 @@
  * border - {String}
  * sizing {String} 'crop', 'scale', or 'image'. Default is "scale"
  * opacity - {Float} Fractional value (0.0 - 1.0)
- */ 
-OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL, 
-                                               position, border, sizing, 
+ */
+OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL,
+                                               position, border, sizing,
                                                opacity) {
 
     OpenLayers.Util.modifyDOMElement(div, id, px, sz, position,
@@ -866,9 +866,9 @@
     if (imgURL) {
         img.src = imgURL;
     }
-    OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz, 
+    OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz,
                                      "relative", border);
-    
+
     if (OpenLayers.Util.alphaHack()) {
         if(div.style.display != "none") {
             div.style.display = "inline-block";
@@ -876,11 +876,11 @@
         if (sizing == null) {
             sizing = "scale";
         }
-        
+
         div.style.filter = "progid:DXImageTransform.Microsoft" +
                            ".AlphaImageLoader(src='" + img.src + "', " +
                            "sizingMethod='" + sizing + "')";
-        if (parseFloat(div.style.opacity) >= 0.0 && 
+        if (parseFloat(div.style.opacity) >= 0.0 &&
             parseFloat(div.style.opacity) < 1.0) {
             div.style.filter += " alpha(opacity=" + div.style.opacity * 100 + ")";
         }
@@ -889,9 +889,9 @@
     }
 };
 
-/** 
+/**
  * Function: createAlphaImageDiv
- * 
+ *
  * id - {String}
  * px - {<OpenLayers.Pixel>}
  * sz - {<OpenLayers.Size>}
@@ -902,17 +902,17 @@
  * opacity - {Float} Fractional value (0.0 - 1.0)
  * delayDisplay - {Boolean} If true waits until the image has been
  *                          loaded.
- * 
+ *
  * Returns:
- * {DOMElement} A DOM Div created with a DOM Image inside it. If the hack is 
+ * {DOMElement} A DOM Div created with a DOM Image inside it. If the hack is
  *              needed for transparency in IE, it is added.
- */ 
-OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL, 
-                                               position, border, sizing, 
+ */
+OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL,
+                                               position, border, sizing,
                                                opacity, delayDisplay) {
-    
+
     var div = OpenLayers.Util.createDiv();
-    var img = OpenLayers.Util.createImage(null, null, null, null, null, null, 
+    var img = OpenLayers.Util.createImage(null, null, null, null, null, null,
                                           null, false);
     div.appendChild(img);
 
@@ -924,23 +924,23 @@
             OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, div));
     }
 
-    OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, position, 
+    OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, position,
                                         border, sizing, opacity);
-    
+
     return div;
 };
 
 
-/** 
+/**
  * Function: upperCaseObject
- * Creates a new hashtable and copies over all the keys from the 
+ * Creates a new hashtable and copies over all the keys from the
  *     passed-in object, but storing them under an uppercased
  *     version of the key at which they were stored.
- * 
- * Parameters: 
+ *
+ * Parameters:
  * object - {Object}
- * 
- * Returns: 
+ *
+ * Returns:
  * {Object} A new Object with all the same keys but uppercased
  */
 OpenLayers.Util.upperCaseObject = function (object) {
@@ -951,12 +951,12 @@
     return uObject;
 };
 
-/** 
+/**
  * Function: applyDefaults
  * Takes an object and copies any properties that don't exist from
  *     another properties, by analogy with OpenLayers.Util.extend() from
  *     Prototype.js.
- * 
+ *
  * Parameters:
  * to - {Object} The destination object.
  * from - {Object} The source object.  Any properties of this object that
@@ -992,27 +992,27 @@
        && from.hasOwnProperty('toString') && !to.hasOwnProperty('toString')) {
         to.toString = from.toString;
     }
-    
+
     return to;
 };
 
 /**
  * Function: getParameterString
- * 
+ *
  * Parameters:
  * params - {Object}
- * 
+ *
  * Returns:
- * {String} A concatenation of the properties of an object in 
- *          http parameter notation. 
+ * {String} A concatenation of the properties of an object in
+ *          http parameter notation.
  *          (ex. <i>"key1=value1&key2=value2&key3=value3"</i>)
  *          If a parameter is actually a list, that parameter will then
  *          be set to a comma-seperated list of values (foo,bar) instead
- *          of being URL escaped (foo%3Abar). 
+ *          of being URL escaped (foo%3Abar).
  */
 OpenLayers.Util.getParameterString = function(params) {
     var paramsArray = [];
-    
+
     for (var key in params) {
       var value = params[key];
       if ((value != null) && (typeof value != 'function')) {
@@ -1032,7 +1032,7 @@
         paramsArray.push(encodeURIComponent(key) + "=" + encodedValue);
       }
     }
-    
+
     return paramsArray.join("&");
 };
 
@@ -1042,9 +1042,9 @@
  */
 OpenLayers.ImgPath = '';
 
-/** 
+/**
  * Function: getImagesLocation
- * 
+ *
  * Returns:
  * {String} The fully formatted image location string
  */
@@ -1053,18 +1053,18 @@
 };
 
 
-/** 
+/**
  * Function: Try
- * Execute functions until one of them doesn't throw an error. 
+ * Execute functions until one of them doesn't throw an error.
  *     Capitalized because "try" is a reserved word in JavaScript.
  *     Taken directly from OpenLayers.Util.Try()
- * 
+ *
  * Parameters:
  * [*] - {Function} Any number of parameters may be passed to Try()
- *    It will attempt to execute each of them until one of them 
- *    successfully executes. 
+ *    It will attempt to execute each of them until one of them
+ *    successfully executes.
  *    If none executes successfully, returns null.
- * 
+ *
  * Returns:
  * {*} The value returned by the first successfully executed function.
  */
@@ -1083,15 +1083,15 @@
 };
 
 
-/** 
+/**
  * Function: getNodes
- * 
+ *
  * These could/should be made namespace aware?
- * 
+ *
  * Parameters:
  * p - {}
  * tagName - {String}
- * 
+ *
  * Returns:
  * {Array}
  */
@@ -1110,11 +1110,11 @@
 
 /**
  * Function: _getNodes
- * 
+ *
  * Parameters:
  * nodes - {Array}
  * tagName - {String}
- * 
+ *
  * Returns:
  * {Array}
  */
@@ -1133,12 +1133,12 @@
 
 /**
  * Function: getTagText
- * 
+ *
  * Parameters:
  * parent - {}
  * item - {String}
  * index - {Integer}
- * 
+ *
  * Returns:
  * {String}
  */
@@ -1150,28 +1150,28 @@
             index=0;
         }
         if (result[index].childNodes.length > 1) {
-            return result.childNodes[1].nodeValue; 
+            return result.childNodes[1].nodeValue;
         }
         else if (result[index].childNodes.length == 1) {
-            return result[index].firstChild.nodeValue; 
+            return result[index].firstChild.nodeValue;
         }
-    } else { 
-        return ""; 
+    } else {
+        return "";
     }
 };
 
 /**
  * Function: getXmlNodeValue
- * 
+ *
  * Parameters:
  * node - {XMLNode}
- * 
+ *
  * Returns:
  * {String} The text value of the given node, without breaking in firefox or IE
  */
 OpenLayers.Util.getXmlNodeValue = function(node) {
     var val = null;
-    OpenLayers.Util.Try( 
+    OpenLayers.Util.Try(
         function() {
             val = node.text;
             if (!val) {
@@ -1180,20 +1180,20 @@
             if (!val) {
                 val = node.firstChild.nodeValue;
             }
-        }, 
+        },
         function() {
             val = node.textContent;
-        }); 
+        });
     return val;
 };
 
-/** 
+/**
  * Function: mouseLeft
- * 
+ *
  * Parameters:
  * evt - {Event}
  * div - {HTMLDivElement}
- * 
+ *
  * Returns:
  * {Boolean}
  */
@@ -1255,10 +1255,10 @@
 
 /**
  * Function: rad
- * 
+ *
  * Parameters:
  * x - {Float}
- * 
+ *
  * Returns:
  * {Float}
  */
@@ -1269,11 +1269,11 @@
  * Given two objects representing points with geographic coordinates, this
  *     calculates the distance between those points on the surface of an
  *     ellipsoid.
- * 
+ *
  * Parameters:
  * p1 - {<OpenLayers.LonLat>} (or any object with both .lat, .lon properties)
  * p2 - {<OpenLayers.LonLat>} (or any object with both .lat, .lon properties)
- * 
+ *
  * Returns:
  * {Float} The distance (in km) between the two input points as measured on an
  *     ellipsoid.  Note that the input point objects must be in geographic
@@ -1320,14 +1320,14 @@
 
 /**
  * Function: getParameters
- * Parse the parameters from a URL or from the current page itself into a 
+ * Parse the parameters from a URL or from the current page itself into a
  *     JavaScript Object. Note that parameter values with commas are separated
  *     out into an Array.
- * 
+ *
  * Parameters:
  * url - {String} Optional url used to extract the query string.
  *                If null, query string is taken from page location.
- * 
+ *
  * Returns:
  * {Object} An object of key/value pairs from the query string.
  */
@@ -1343,7 +1343,7 @@
                     url.indexOf('#') : url.length;
         paramsString = url.substring(start, end);
     }
-        
+
     var parameters = {};
     var pairs = paramsString.split(/[&;]/);
     for(var i=0, len=pairs.length; i<len; ++i) {
@@ -1358,11 +1358,11 @@
                 value[j] = decodeURIComponent(value[j]);
             }
 
-            //if there's only one value, do not return as array                    
+            //if there's only one value, do not return as array
             if (value.length == 1) {
                 value = value[0];
-            }                
-            
+            }
+
             parameters[key] = value;
          }
      }
@@ -1373,11 +1373,11 @@
  * Function: getArgs
  * *Deprecated*.  Will be removed in 3.0.  Please use instead
  *     <OpenLayers.Util.getParameters>
- * 
+ *
  * Parameters:
  * url - {String} Optional url used to extract the query string.
  *                If null, query string is taken from page location.
- * 
+ *
  * Returns:
  * {Object} An object of key/value pairs from the query string.
  */
@@ -1402,10 +1402,10 @@
  * Create a unique identifier for this session.  Each time this function
  *     is called, a counter is incremented.  The return will be the optional
  *     prefix (defaults to "id_") appended with the counter value.
- * 
+ *
  * Parameters:
  * prefix {String} Optionsal string to prefix unique id. Default is "id_".
- * 
+ *
  * Returns:
  * {String} A unique id string, built on the passed in prefix.
  */
@@ -1413,8 +1413,8 @@
     if (prefix == null) {
         prefix = "id_";
     }
-    OpenLayers.Util.lastSeqID += 1; 
-    return prefix + OpenLayers.Util.lastSeqID;        
+    OpenLayers.Util.lastSeqID += 1;
+    return prefix + OpenLayers.Util.lastSeqID;
 };
 
 /**
@@ -1426,7 +1426,7 @@
  * The hardcoded table is maintain in a CS-MAP source code module named CSdataU.c
  * The hardcoded table of PROJ.4 units are in pj_units.c.
  */
-OpenLayers.INCHES_PER_UNIT = { 
+OpenLayers.INCHES_PER_UNIT = {
     'inches': 1.0,
     'ft': 12.0,
     'mi': 63360.0,
@@ -1512,8 +1512,8 @@
     "ch": OpenLayers.INCHES_PER_UNIT["IntnlChain"],  //International Chain
     "link": OpenLayers.INCHES_PER_UNIT["IntnlLink"], //International Link
     "us-in": OpenLayers.INCHES_PER_UNIT["inches"], //U.S. Surveyor's Inch
-    "us-ft": OpenLayers.INCHES_PER_UNIT["Foot"],	//U.S. Surveyor's Foot
-    "us-yd": OpenLayers.INCHES_PER_UNIT["Yard"],	//U.S. Surveyor's Yard
+    "us-ft": OpenLayers.INCHES_PER_UNIT["Foot"],    //U.S. Surveyor's Foot
+    "us-yd": OpenLayers.INCHES_PER_UNIT["Yard"],    //U.S. Surveyor's Yard
     "us-ch": OpenLayers.INCHES_PER_UNIT["GunterChain"], //U.S. Surveyor's Chain
     "us-mi": OpenLayers.INCHES_PER_UNIT["Mile"],   //U.S. Surveyor's Statute Mile
     "ind-yd": OpenLayers.INCHES_PER_UNIT["IndianYd37"],  //Indian Yard
@@ -1521,7 +1521,7 @@
     "ind-ch": 20.11669506 / OpenLayers.METERS_PER_INCH  //Indian Chain
 });
 
-/** 
+/**
  * Constant: DOTS_PER_INCH
  * {Integer} 72 (A sensible default)
  */
@@ -1529,32 +1529,32 @@
 
 /**
  * Function: normalizeScale
- * 
+ *
  * Parameters:
  * scale - {float}
- * 
+ *
  * Returns:
- * {Float} A normalized scale value, in 1 / X format. 
+ * {Float} A normalized scale value, in 1 / X format.
  *         This means that if a value less than one ( already 1/x) is passed
- *         in, it just returns scale directly. Otherwise, it returns 
+ *         in, it just returns scale directly. Otherwise, it returns
  *         1 / scale
  */
 OpenLayers.Util.normalizeScale = function (scale) {
-    var normScale = (scale > 1.0) ? (1.0 / scale) 
+    var normScale = (scale > 1.0) ? (1.0 / scale)
                                   : scale;
     return normScale;
 };
 
 /**
  * Function: getResolutionFromScale
- * 
+ *
  * Parameters:
  * scale - {Float}
  * units - {String} Index into OpenLayers.INCHES_PER_UNIT hashtable.
  *                  Default is degrees
- * 
+ *
  * Returns:
- * {Float} The corresponding resolution given passed-in scale and unit 
+ * {Float} The corresponding resolution given passed-in scale and unit
  *         parameters.
  */
 OpenLayers.Util.getResolutionFromScale = function (scale, units) {
@@ -1572,14 +1572,14 @@
 
 /**
  * Function: getScaleFromResolution
- * 
+ *
  * Parameters:
  * resolution - {Float}
  * units - {String} Index into OpenLayers.INCHES_PER_UNIT hashtable.
  *                  Default is degrees
- * 
+ *
  * Returns:
- * {Float} The corresponding scale given passed-in resolution and unit 
+ * {Float} The corresponding scale given passed-in resolution and unit
  *         parameters.
  */
 OpenLayers.Util.getScaleFromResolution = function (resolution, units) {
@@ -1595,13 +1595,13 @@
 
 /**
  * Function: safeStopPropagation
- * *Deprecated*. This function has been deprecated. Please use directly 
- *     <OpenLayers.Event.stop> passing 'true' as the 2nd 
+ * *Deprecated*. This function has been deprecated. Please use directly
+ *     <OpenLayers.Event.stop> passing 'true' as the 2nd
  *     argument (preventDefault)
- * 
+ *
  * Safely stop the propagation of an event *without* preventing
  *   the default browser action from occurring.
- * 
+ *
  * Parameter:
  * evt - {Event}
  */
@@ -1611,11 +1611,11 @@
 
 /**
  * Function: pagePositon
- * Calculates the position of an element on the page. 
+ * Calculates the position of an element on the page.
  *
  * Parameters:
  * forElement - {DOMElement}
- * 
+ *
  * Returns:
  * {Array} two item array, L value then T value.
  */
@@ -1631,7 +1631,7 @@
                 break;
             }
         }
-        
+
         valueT += element.offsetTop  || 0;
         valueL += element.offsetLeft || 0;
 
@@ -1652,25 +1652,25 @@
         valueL -= element.scrollLeft || 0;
         element = element.parentNode;
     }
-    
+
     return [valueL, valueT];
 };
 
 
-/** 
+/**
  * Function: isEquivalentUrl
- * Test two URLs for equivalence. 
- * 
+ * Test two URLs for equivalence.
+ *
  * Setting 'ignoreCase' allows for case-independent comparison.
- * 
- * Comparison is based on: 
+ *
+ * Comparison is based on:
  *  - Protocol
  *  - Host (evaluated without the port)
  *  - Port (set 'ignorePort80' to ignore "80" values)
  *  - Hash ( set 'ignoreHash' to disable)
- *  - Pathname (for relative <-> absolute comparison) 
+ *  - Pathname (for relative <-> absolute comparison)
  *  - Arguments (so they can be out of order)
- *  
+ *
  * Parameters:
  * url1 - {String}
  * url2 - {String}
@@ -1714,22 +1714,22 @@
     for(var key in urlObj2.args) {
         return false;
     }
-    
+
     return true;
 };
 
 /**
  * Function: createUrlObject
- * 
+ *
  * Parameters:
  * url - {String}
  * options - {Object} A hash of options.  Can be one of:
  *            ignoreCase: lowercase url,
  *            ignorePort80: don't include explicit port if port is 80,
  *            ignoreHash: Don't include part of url after the hash (#).
- * 
+ *
  * Returns:
- * {Object} An object with separate url, a, port, host, and args parsed out 
+ * {Object} An object with separate url, a, port, host, and args parsed out
  *          and ready for comparison
  */
 OpenLayers.Util.createUrlObject = function(url, options) {
@@ -1750,21 +1750,21 @@
             url = fullUrl + parts.join("/") + "/" + url;
         }
     }
-  
+
     if (options.ignoreCase) {
-        url = url.toLowerCase(); 
+        url = url.toLowerCase();
     }
 
     var a = document.createElement('a');
     a.href = url;
-    
+
     var urlObject = {};
-    
+
     //host (without port)
     urlObject.host = a.host.split(":").shift();
 
     //protocol
-    urlObject.protocol = a.protocol;  
+    urlObject.protocol = a.protocol;
 
     //port (get uniform browser behavior with port 80 here)
     if(options.ignorePort80) {
@@ -1774,8 +1774,8 @@
     }
 
     //hash
-    urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash;  
-    
+    urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash;
+
     //args
     var queryString = a.search;
     if (!queryString) {
@@ -1786,30 +1786,30 @@
 
     //pathname (uniform browser behavior with leading "/")
     urlObject.pathname = (a.pathname.charAt(0) == "/") ? a.pathname : "/" + a.pathname;
-    
-    return urlObject; 
+
+    return urlObject;
 };
- 
+
 /**
  * Function: removeTail
  * Takes a url and removes everything after the ? and #
- * 
+ *
  * Parameters:
  * url - {String} The url to process
- * 
+ *
  * Returns:
  * {String} The string with all queryString and Hash removed
  */
 OpenLayers.Util.removeTail = function(url) {
     var head = null;
-    
+
     var qMark = url.indexOf("?");
     var hashMark = url.indexOf("#");
 
     if (qMark == -1) {
         head = (hashMark != -1) ? url.substr(0,hashMark) : url;
     } else {
-        head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark)) 
+        head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark))
                                   : url.substr(0, qMark);
     }
     return head;
@@ -1818,24 +1818,24 @@
 
 /**
  * Function: getBrowserName
- * 
+ *
  * Returns:
- * {String} A string which specifies which is the current 
- *          browser in which we are running. 
- * 
+ * {String} A string which specifies which is the current
+ *          browser in which we are running.
+ *
  *          Currently-supported browser detection and codes:
  *           * 'opera' -- Opera
  *           * 'msie'  -- Internet Explorer
  *           * 'safari' -- Safari
  *           * 'firefox' -- FireFox
  *           * 'mozilla' -- Mozilla
- * 
- *          If we are unable to property identify the browser, we 
+ *
+ *          If we are unable to property identify the browser, we
  *           return an empty string.
  */
 OpenLayers.Util.getBrowserName = function() {
     var browserName = "";
-    
+
     var ua = navigator.userAgent.toLowerCase();
     if ( ua.indexOf( "opera" ) != -1 ) {
         browserName = "opera";
@@ -1850,46 +1850,46 @@
             browserName = "mozilla";
         }
     }
-    
+
     return browserName;
 };
 
 
 
-    
+
 /**
  * Method: getRenderedDimensions
  * Renders the contentHTML offscreen to determine actual dimensions for
  *     popup sizing. As we need layout to determine dimensions the content
- *     is rendered -9999px to the left and absolute to ensure the 
+ *     is rendered -9999px to the left and absolute to ensure the
  *     scrollbars do not flicker
- *     
+ *
  * Parameters:
  * contentHTML
- * size - {<OpenLayers.Size>} If either the 'w' or 'h' properties is 
- *     specified, we fix that dimension of the div to be measured. This is 
- *     useful in the case where we have a limit in one dimension and must 
+ * size - {<OpenLayers.Size>} If either the 'w' or 'h' properties is
+ *     specified, we fix that dimension of the div to be measured. This is
+ *     useful in the case where we have a limit in one dimension and must
  *     therefore meaure the flow in the other dimension.
  * options - {Object}
  *     displayClass - {String} Optional parameter.  A CSS class name(s) string
  *         to provide the CSS context of the rendered content.
- *     containerElement - {DOMElement} Optional parameter. Insert the HTML to 
- *         this node instead of the body root when calculating dimensions. 
- * 
+ *     containerElement - {DOMElement} Optional parameter. Insert the HTML to
+ *         this node instead of the body root when calculating dimensions.
+ *
  * Returns:
  * {OpenLayers.Size}
  */
 OpenLayers.Util.getRenderedDimensions = function(contentHTML, size, options) {
-    
+
     var w, h;
-    
+
     // create temp container div with restricted size
     var container = document.createElement("div");
     container.style.visibility = "hidden";
-        
-    var containerElement = (options && options.containerElement) 
-    	? options.containerElement : document.body;
 
+    var containerElement = (options && options.containerElement)
+        ? options.containerElement : document.body;
+
     //fix a dimension, if specified.
     if (size) {
         if (size.w) {
@@ -1905,11 +1905,11 @@
     if (options && options.displayClass) {
         container.className = options.displayClass;
     }
-    
+
     // create temp content div and assign content
     var content = document.createElement("div");
     content.innerHTML = contentHTML;
-    
+
     // we need overflow visible when calculating the size
     content.style.overflow = "visible";
     if (content.childNodes) {
@@ -1918,13 +1918,13 @@
             content.childNodes[i].style.overflow = "visible";
         }
     }
-    
-    // add content to restricted container 
+
+    // add content to restricted container
     container.appendChild(content);
-    
+
     // append container to body for rendering
     containerElement.appendChild(container);
-    
+
     // Opera and IE7 can't handle a node with position:aboslute if it inherits
     // position:absolute from a parent.
     var parentHasPositionAbsolute = false;
@@ -1943,14 +1943,14 @@
     if(!parentHasPositionAbsolute) {
         container.style.position = "absolute";
     }
-    
+
     // calculate scroll width of content and add corners and shadow width
     if (!w) {
         w = parseInt(content.scrollWidth);
-    
+
         // update container width to allow height to adjust
         container.style.width = w + "px";
-    }        
+    }
     // capture height and add shadow and corner image widths
     if (!h) {
         h = parseInt(content.scrollHeight);
@@ -1959,35 +1959,35 @@
     // remove elements
     container.removeChild(content);
     containerElement.removeChild(container);
-    
+
     return new OpenLayers.Size(w, h);
 };
 
 /**
  * APIFunction: getScrollbarWidth
  * This function has been modified by the OpenLayers from the original version,
- *     written by Matthew Eernisse and released under the Apache 2 
+ *     written by Matthew Eernisse and released under the Apache 2
  *     license here:
- * 
+ *
  *     http://www.fleegix.org/articles/2006/05/30/getting-the-scrollbar-width-in-pixels
- * 
- *     It has been modified simply to cache its value, since it is physically 
- *     impossible that this code could ever run in more than one browser at 
- *     once. 
- * 
+ *
+ *     It has been modified simply to cache its value, since it is physically
+ *     impossible that this code could ever run in more than one browser at
+ *     once.
+ *
  * Returns:
  * {Integer}
  */
 OpenLayers.Util.getScrollbarWidth = function() {
-    
+
     var scrollbarWidth = OpenLayers.Util._scrollbarWidth;
-    
+
     if (scrollbarWidth == null) {
         var scr = null;
         var inn = null;
         var wNoScroll = 0;
         var wScroll = 0;
-    
+
         // Outer scrolling div
         scr = document.createElement('div');
         scr.style.position = 'absolute';
@@ -1997,28 +1997,28 @@
         scr.style.height = '50px';
         // Start with no scrollbar
         scr.style.overflow = 'hidden';
-    
+
         // Inner content div
         inn = document.createElement('div');
         inn.style.width = '100%';
         inn.style.height = '200px';
-    
+
         // Put the inner div in the scrolling div
         scr.appendChild(inn);
         // Append the scrolling div to the doc
         document.body.appendChild(scr);
-    
+
         // Width of the inner div sans scrollbar
         wNoScroll = inn.offsetWidth;
-    
+
         // Add the scrollbar
         scr.style.overflow = 'scroll';
         // Width of the inner div width scrollbar
         wScroll = inn.offsetWidth;
-    
+
         // Remove the scrolling div from the doc
         document.body.removeChild(document.body.lastChild);
-    
+
         // Pixel width of the scroller
         OpenLayers.Util._scrollbarWidth = (wNoScroll - wScroll);
         scrollbarWidth = OpenLayers.Util._scrollbarWidth;
@@ -2046,7 +2046,7 @@
  * Note that behavior will differ with the Firebug extention and Firebug Lite.
  * Most notably, the Firebug Lite console does not currently allow for
  * hyperlinks to code or for clicking on object to explore their properties.
- * 
+ *
  */
 OpenLayers.Console = {
     /**
@@ -2055,7 +2055,7 @@
      * included.  We explicitly require the Firebug Lite script to trigger
      * functionality of the OpenLayers.Console methods.
      */
-    
+
     /**
      * APIFunction: log
      * Log an object in the console.  The Firebug Lite console logs string
@@ -2065,7 +2065,7 @@
      * will be used in string substitution.  Any additional arguments (beyond
      * the number substituted in a format string) will be appended in a space-
      * delimited line.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2077,7 +2077,7 @@
      * where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2089,7 +2089,7 @@
      * coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2101,7 +2101,7 @@
      * color coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2113,12 +2113,12 @@
      * coding and a hyperlink to the line where it was called.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
     error: function() {},
-    
+
     /**
      * APIFunction: userError
      * A single interface for showing error messages to the user. The default
@@ -2126,7 +2126,7 @@
      * reassigning OpenLayers.Console.userError to a different function.
      *
      * Expects a single error message
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2140,7 +2140,7 @@
      * the console and throw an exception.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2150,7 +2150,7 @@
      * APIFunction: dir
      * Prints an interactive listing of all properties of the object. This
      * looks identical to the view that you would see in the DOM tab.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2161,7 +2161,7 @@
      * Prints the XML source tree of an HTML or XML element. This looks
      * identical to the view that you would see in the HTML tab. You can click
      * on any node to inspect it in the HTML tab.
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2174,7 +2174,7 @@
      * as well as the values that were passed as arguments to each function.
      * You can click each function to take you to its source in the Script tab,
      * and click each argument value to inspect it in the DOM or HTML tabs.
-     * 
+     *
      */
     trace: function() {},
 
@@ -2185,7 +2185,7 @@
      * to close the block.
      *
      * May be called with multiple arguments as with OpenLayers.Console.log().
-     * 
+     *
      * Parameters:
      * object - {Object}
      */
@@ -2197,7 +2197,7 @@
      * OpenLayers.Console.group
      */
     groupEnd: function() {},
-    
+
     /**
      * APIFunction: time
      * Creates a new timer under the given name. Call
@@ -2225,7 +2225,7 @@
      * contain the text to be printed in the header of the profile report.
      *
      * This function is not currently implemented in Firebug Lite.
-     * 
+     *
      * Parameters:
      * title - {String} Optional title for the profiler
      */
@@ -2234,7 +2234,7 @@
     /**
      * APIFunction: profileEnd
      * Turns off the JavaScript profiler and prints its report.
-     * 
+     *
      * This function is not currently implemented in Firebug Lite.
      */
     profileEnd: function() {},
@@ -2293,8 +2293,8 @@
  * @requires OpenLayers/Lang/en.js
  * @requires OpenLayers/Console.js
  */
- 
-/** 
+
+/**
  * Header: OpenLayers Base Types
  * OpenLayers custom string, number and function functions are described here.
  */
@@ -2307,12 +2307,12 @@
 
     /**
      * APIFunction: startsWith
-     * Test whether a string starts with another string. 
-     * 
+     * Test whether a string starts with another string.
+     *
      * Parameters:
      * str - {String} The string to test.
      * sub - {Sring} The substring to look for.
-     *  
+     *
      * Returns:
      * {Boolean} The first string starts with the second.
      */
@@ -2323,43 +2323,43 @@
     /**
      * APIFunction: contains
      * Test whether a string contains another string.
-     * 
+     *
      * Parameters:
      * str - {String} The string to test.
      * sub - {String} The substring to look for.
-     * 
+     *
      * Returns:
      * {Boolean} The first string contains the second.
      */
     contains: function(str, sub) {
         return (str.indexOf(sub) != -1);
     },
-    
+
     /**
      * APIFunction: trim
      * Removes leading and trailing whitespace characters from a string.
-     * 
+     *
      * Parameters:
      * str - {String} The (potentially) space padded string.  This string is not
      *     modified.
-     * 
+     *
      * Returns:
-     * {String} A trimmed version of the string with all leading and 
+     * {String} A trimmed version of the string with all leading and
      *     trailing spaces removed.
      */
     trim: function(str) {
         return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
     },
-    
+
     /**
      * APIFunction: camelize
-     * Camel-case a hyphenated string. 
+     * Camel-case a hyphenated string.
      *     Ex. "chicken-head" becomes "chickenHead", and
      *     "-chicken-head" becomes "ChickenHead".
      *
      * Parameters:
      * str - {String} The string to be camelized.  The original is not modified.
-     * 
+     *
      * Returns:
      * {String} The string, camelized
      */
@@ -2372,7 +2372,7 @@
         }
         return camelizedString;
     },
-    
+
     /**
      * APIFunction: format
      * Given a string with tokens in the form ${token}, return a string
@@ -2399,7 +2399,7 @@
             context = window;
         }
 
-        // Example matching: 
+        // Example matching:
         // str   = ${foo.bar}
         // match = foo.bar
         var replacer = function(str, match) {
@@ -2425,13 +2425,13 @@
             }
 
             // If replacement is undefined, return the string 'undefined'.
-            // This is a workaround for a bugs in browsers not properly 
+            // This is a workaround for a bugs in browsers not properly
             // dealing with non-participating groups in regular expressions:
             // http://blog.stevenlevithan.com/archives/npcg-javascript
             if (typeof replacement == 'undefined') {
                 return 'undefined';
             } else {
-                return replacement; 
+                return replacement;
             }
         };
 
@@ -2444,13 +2444,13 @@
      * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
      */
     tokenRegEx:  /\$\{([\w.]+?)\}/g,
-    
+
     /**
      * Property: OpenLayers.String.numberRegEx
      * Used to test strings as numbers.
      */
     numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,
-    
+
     /**
      * APIFunction: OpenLayers.String.isNumeric
      * Determine whether a string contains only a numeric value.
@@ -2469,14 +2469,14 @@
     isNumeric: function(value) {
         return OpenLayers.String.numberRegEx.test(value);
     },
-    
+
     /**
      * APIFunction: numericIf
      * Converts a string that appears to be a numeric value into a number.
-     * 
+     *
      * Returns
      * {Number|String} a Number if the passed value is a number, a String
-     *     otherwise. 
+     *     otherwise.
      */
     numericIf: function(value) {
         return OpenLayers.String.isNumeric(value) ? parseFloat(value) : value;
@@ -2487,11 +2487,11 @@
 if (!String.prototype.startsWith) {
     /**
      * APIMethod: String.startsWith
-     * *Deprecated*. Whether or not a string starts with another string. 
-     * 
+     * *Deprecated*. Whether or not a string starts with another string.
+     *
      * Parameters:
      * sStart - {Sring} The string we're testing for.
-     *  
+     *
      * Returns:
      * {Boolean} Whether or not this string starts with the string passed in.
      */
@@ -2506,10 +2506,10 @@
     /**
      * APIMethod: String.contains
      * *Deprecated*. Whether or not a string contains another string.
-     * 
+     *
      * Parameters:
      * str - {String} The string that we're testing for.
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not this string contains with the string passed in.
      */
@@ -2524,9 +2524,9 @@
     /**
      * APIMethod: String.trim
      * *Deprecated*. Removes leading and trailing whitespace characters from a string.
-     * 
+     *
      * Returns:
-     * {String} A trimmed version of the string - all leading and 
+     * {String} A trimmed version of the string - all leading and
      *          trailing spaces removed
      */
     String.prototype.trim = function() {
@@ -2539,10 +2539,10 @@
 if (!String.prototype.camelize) {
     /**
      * APIMethod: String.camelize
-     * *Deprecated*. Camel-case a hyphenated string. 
+     * *Deprecated*. Camel-case a hyphenated string.
      *     Ex. "chicken-head" becomes "chickenHead", and
      *     "-chicken-head" becomes "ChickenHead".
-     * 
+     *
      * Returns:
      * {String} The string, camelized
      */
@@ -2564,21 +2564,21 @@
      * Decimal separator to use when formatting numbers.
      */
     decimalSeparator: ".",
-    
+
     /**
      * Property: thousandsSeparator
      * Thousands separator to use when formatting numbers.
      */
     thousandsSeparator: ",",
-    
+
     /**
      * APIFunction: limitSigDigs
      * Limit the number of significant digits on a float.
-     * 
+     *
      * Parameters:
      * num - {Float}
      * sig - {Integer}
-     * 
+     *
      * Returns:
      * {Float} The number, rounded to the specified number of significant
      *     digits.
@@ -2590,11 +2590,11 @@
         }
         return fig;
     },
-    
+
     /**
      * APIFunction: format
      * Formats a number for output.
-     * 
+     *
      * Parameters:
      * num  - {Float}
      * dec  - {Integer} Number of decimal places to round to.
@@ -2608,9 +2608,9 @@
      * {String} A string representing the formatted number.
      */
     format: function(num, dec, tsep, dsep) {
-        dec = (typeof dec != "undefined") ? dec : 0; 
+        dec = (typeof dec != "undefined") ? dec : 0;
         tsep = (typeof tsep != "undefined") ? tsep :
-            OpenLayers.Number.thousandsSeparator; 
+            OpenLayers.Number.thousandsSeparator;
         dsep = (typeof dsep != "undefined") ? dsep :
             OpenLayers.Number.decimalSeparator;
 
@@ -2623,15 +2623,15 @@
             // integer where we do not want to touch the decimals
             dec = 0;
         }
-        
+
         var integer = parts[0];
         if (tsep) {
-            var thousands = /(-?[0-9]+)([0-9]{3})/; 
-            while(thousands.test(integer)) { 
-                integer = integer.replace(thousands, "$1" + tsep + "$2"); 
+            var thousands = /(-?[0-9]+)([0-9]{3})/;
+            while(thousands.test(integer)) {
+                integer = integer.replace(thousands, "$1" + tsep + "$2");
             }
         }
-        
+
         var str;
         if (dec == 0) {
             str = integer;
@@ -2651,10 +2651,10 @@
      * APIMethod: Number.limitSigDigs
      * *Deprecated*. Limit the number of significant digits on an integer. Does *not*
      *     work with floats!
-     * 
+     *
      * Parameters:
      * sig - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} The number, rounded to the specified number of significant digits.
      *           If null, 0, or negative value passed in, returns 0
@@ -2675,11 +2675,11 @@
      * APIFunction: bind
      * Bind a function to an object.  Method to easily create closures with
      *     'this' altered.
-     * 
+     *
      * Parameters:
      * func - {Function} Input function.
      * object - {Object} The object to bind to the input function (as this).
-     * 
+     *
      * Returns:
      * {Function} A closure with 'this' set to the passed in object.
      */
@@ -2695,16 +2695,16 @@
             return func.apply(object, newArgs);
         };
     },
-    
+
     /**
      * APIFunction: bindAsEventListener
      * Bind a function to an object, and configure it to receive the event
-     *     object as first parameter when called. 
-     * 
+     *     object as first parameter when called.
+     *
      * Parameters:
      * func - {Function} Input function to serve as an event listener.
      * object - {Object} A reference to this.
-     * 
+     *
      * Returns:
      * {Function}
      */
@@ -2718,12 +2718,12 @@
 if (!Function.prototype.bind) {
     /**
      * APIMethod: Function.bind
-     * *Deprecated*. Bind a function to an object. 
+     * *Deprecated*. Bind a function to an object.
      * Method to easily create closures with 'this' altered.
-     * 
+     *
      * Parameters:
      * object - {Object} the this parameter
-     * 
+     *
      * Returns:
      * {Function} A closure with 'this' altered to the first
      *            argument.
@@ -2741,11 +2741,11 @@
     /**
      * APIMethod: Function.bindAsEventListener
      * *Deprecated*. Bind a function to an object, and configure it to receive the
-     *     event object as first parameter when called. 
-     * 
+     *     event object as first parameter when called.
+     *
      * Parameters:
      * object - {Object} A reference to this.
-     * 
+     *
      * Returns:
      * {Function}
      */
@@ -2802,11 +2802,11 @@
                         selected.push(val);
                     }
                 }
-            }        
+            }
         }
         return selected;
     }
-    
+
 };
 /* ======================================================================
     OpenLayers/BaseTypes/Class.js
@@ -2818,13 +2818,13 @@
 
 /**
  * Constructor: OpenLayers.Class
- * Base class used to construct all other classes. Includes support for 
- *     multiple inheritance. 
- *     
- * This constructor is new in OpenLayers 2.5.  At OpenLayers 3.0, the old 
- *     syntax for creating classes and dealing with inheritance 
+ * Base class used to construct all other classes. Includes support for
+ *     multiple inheritance.
+ *
+ * This constructor is new in OpenLayers 2.5.  At OpenLayers 3.0, the old
+ *     syntax for creating classes and dealing with inheritance
  *     will be removed.
- * 
+ *
  * To create a new OpenLayers-style class, use the following syntax:
  * > var MyClass = OpenLayers.Class(prototype);
  *
@@ -2945,7 +2945,7 @@
      * {Number} width
      */
     w: 0.0,
-    
+
     /**
      * APIProperty: h
      * {Number} height
@@ -2971,7 +2971,7 @@
      * Return the string representation of a size object
      *
      * Returns:
-     * {String} The string representation of OpenLayers.Size object. 
+     * {String} The string representation of OpenLayers.Size object.
      * (ex. <i>"w=55,h=66"</i>)
      */
     toString:function() {
@@ -2998,7 +2998,7 @@
      * Parameters:
      * sz - {<OpenLayers.Size>}
      *
-     * Returns: 
+     * Returns:
      * {Boolean} The passed in size has the same h and w properties as this one.
      * Note that if sz passed in is null, returns false.
      *
@@ -3031,7 +3031,7 @@
  * Instances of this class represent bounding boxes.  Data stored as left,
  * bottom, right, top floats. All values are initialized to null, however,
  * you should make sure you set them before using the bounds for anything.
- * 
+ *
  * Possible use case:
  * > bounds = new OpenLayers.Bounds();
  * > bounds.extend(new OpenLayers.LonLat(4,5));
@@ -3063,7 +3063,7 @@
      * {Number} Maximum vertical coordinate.
      */
     top: null,
-    
+
     /**
      * Property: centerLonLat
      * {<OpenLayers.LonLat>} A cached center location.  This should not be
@@ -3106,7 +3106,7 @@
      * {<OpenLayers.Bounds>} A fresh copy of the bounds
      */
     clone:function() {
-        return new OpenLayers.Bounds(this.left, this.bottom, 
+        return new OpenLayers.Bounds(this.left, this.bottom,
                                      this.right, this.top);
     },
 
@@ -3119,25 +3119,25 @@
      *
      * Returns:
      * {Boolean} The passed-in bounds object has the same left,
-     *           right, top, bottom components as this.  Note that if bounds 
+     *           right, top, bottom components as this.  Note that if bounds
      *           passed in is null, returns false.
      */
     equals:function(bounds) {
         var equals = false;
         if (bounds != null) {
-            equals = ((this.left == bounds.left) && 
+            equals = ((this.left == bounds.left) &&
                       (this.right == bounds.right) &&
-                      (this.top == bounds.top) && 
+                      (this.top == bounds.top) &&
                       (this.bottom == bounds.bottom));
         }
         return equals;
     },
 
-    /** 
+    /**
      * APIMethod: toString
-     * 
+     *
      * Returns:
-     * {String} String representation of bounds object. 
+     * {String} String representation of bounds object.
      *          (ex.<i>"left-bottom=(5,42) right-top=(10,45)"</i>)
      */
     toString:function() {
@@ -3153,32 +3153,32 @@
      */
     toArray: function() {
         return [this.left, this.bottom, this.right, this.top];
-    },    
+    },
 
-    /** 
+    /**
      * APIMethod: toBBOX
-     * 
+     *
      * Parameters:
      * decimal - {Integer} How many significant digits in the bbox coords?
      *                     Default is 6
-     * 
+     *
      * Returns:
      * {String} Simple String representation of bounds object.
      *          (ex. <i>"5,42,10,45"</i>)
      */
     toBBOX:function(decimal) {
         if (decimal== null) {
-            decimal = 6; 
+            decimal = 6;
         }
         var mult = Math.pow(10, decimal);
-        var bbox = Math.round(this.left * mult) / mult + "," + 
-                   Math.round(this.bottom * mult) / mult + "," + 
-                   Math.round(this.right * mult) / mult + "," + 
+        var bbox = Math.round(this.left * mult) / mult + "," +
+                   Math.round(this.bottom * mult) / mult + "," +
+                   Math.round(this.right * mult) / mult + "," +
                    Math.round(this.top * mult) / mult;
 
         return bbox;
     },
- 
+
     /**
      * APIMethod: toGeometry
      * Create a new polygon geometry based on this bounds.
@@ -3197,10 +3197,10 @@
             ])
         ]);
     },
-    
+
     /**
      * APIMethod: getWidth
-     * 
+     *
      * Returns:
      * {Float} The width of the bounds
      */
@@ -3210,7 +3210,7 @@
 
     /**
      * APIMethod: getHeight
-     * 
+     *
      * Returns:
      * {Float} The height of the bounds (top minus bottom).
      */
@@ -3220,7 +3220,7 @@
 
     /**
      * APIMethod: getSize
-     * 
+     *
      * Returns:
      * {<OpenLayers.Size>} The size of the box.
      */
@@ -3230,7 +3230,7 @@
 
     /**
      * APIMethod: getCenterPixel
-     * 
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The center of the bounds in pixel space.
      */
@@ -3241,7 +3241,7 @@
 
     /**
      * APIMethod: getCenterLonLat
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The center of the bounds in map space.
      */
@@ -3256,12 +3256,12 @@
 
     /**
      * Method: scale
-     * Scales the bounds around a pixel or lonlat. Note that the new 
+     * Scales the bounds around a pixel or lonlat. Note that the new
      *     bounds may return non-integer properties, even if a pixel
-     *     is passed. 
-     * 
+     *     is passed.
+     *
      * Parameters:
-     * ratio - {Float} 
+     * ratio - {Float}
      * origin - {<OpenLayers.Pixel> or <OpenLayers.LonLat>}
      *          Default is center.
      *
@@ -3276,7 +3276,7 @@
         }
 
         var bounds = [];
-        
+
         var origx,origy;
 
         // get origin coordinates
@@ -3292,17 +3292,17 @@
         var bottom = (this.bottom - origy) * ratio + origy;
         var right = (this.right - origx) * ratio + origx;
         var top = (this.top - origy) * ratio + origy;
-        
+
         return new OpenLayers.Bounds(left, bottom, right, top);
     },
 
     /**
      * APIMethod: add
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>} A new bounds whose coordinates are the same as
      *     this, but shifted by the passed-in x and y values.
@@ -3316,13 +3316,13 @@
         return new OpenLayers.Bounds(this.left + x, this.bottom + y,
                                      this.right + x, this.top + y);
     },
-    
+
     /**
      * APIMethod: extend
      * Extend the bounds to include the point, lonlat, or bounds specified.
      *     Note, this function assumes that left < right and bottom < top.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * object - {Object} Can be LonLat, Point, or Bounds
      */
     extend:function(object) {
@@ -3330,7 +3330,7 @@
         if (object) {
             // clear cached center location
             switch(object.CLASS_NAME) {
-                case "OpenLayers.LonLat":    
+                case "OpenLayers.LonLat":
                     bounds = new OpenLayers.Bounds(object.lon, object.lat,
                                                     object.lon, object.lat);
                     break;
@@ -3338,12 +3338,12 @@
                     bounds = new OpenLayers.Bounds(object.x, object.y,
                                                     object.x, object.y);
                     break;
-                    
-                case "OpenLayers.Bounds":    
+
+                case "OpenLayers.Bounds":
                     bounds = object;
                     break;
             }
-    
+
             if (bounds) {
                 this.centerLonLat = null;
                 if ( (this.left == null) || (bounds.left < this.left)) {
@@ -3351,11 +3351,11 @@
                 }
                 if ( (this.bottom == null) || (bounds.bottom < this.bottom) ) {
                     this.bottom = bounds.bottom;
-                } 
+                }
                 if ( (this.right == null) || (bounds.right > this.right) ) {
                     this.right = bounds.right;
                 }
-                if ( (this.top == null) || (bounds.top > this.top) ) { 
+                if ( (this.top == null) || (bounds.top > this.top) ) {
                     this.top = bounds.top;
                 }
             }
@@ -3364,7 +3364,7 @@
 
     /**
      * APIMethod: containsLonLat
-     * 
+     *
      * Parameters:
      * ll - {<OpenLayers.LonLat>}
      * inclusive - {Boolean} Whether or not to include the border.
@@ -3379,7 +3379,7 @@
 
     /**
      * APIMethod: containsPixel
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      * inclusive - {Boolean} Whether or not to include the border. Default is
@@ -3391,10 +3391,10 @@
     containsPixel:function(px, inclusive) {
         return this.contains(px.x, px.y, inclusive);
     },
-    
+
     /**
      * APIMethod: contains
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
@@ -3420,12 +3420,12 @@
 
         var contains = false;
         if (inclusive) {
-            contains = ((x >= this.left) && (x <= this.right) && 
+            contains = ((x >= this.left) && (x <= this.right) &&
                         (y >= this.bottom) && (y <= this.top));
         } else {
-            contains = ((x > this.left) && (x < this.right) && 
+            contains = ((x > this.left) && (x < this.right) &&
                         (y > this.bottom) && (y < this.top));
-        }              
+        }
         return contains;
     },
 
@@ -3434,7 +3434,7 @@
      * Determine whether the target bounds intersects this bounds.  Bounds are
      *     considered intersecting if any of their edges intersect or if one
      *     bounds contains the other.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>} The target bounds.
      * inclusive - {Boolean} Treat coincident borders as intersecting.  Default
@@ -3455,7 +3455,7 @@
             this.top == bounds.bottom ||
             this.bottom == bounds.top
         );
-        
+
         // if the two bounds only touch at an edge, and inclusive is false,
         // then the bounds don't *really* intersect.
         if (inclusive || !mightTouch) {
@@ -3481,11 +3481,11 @@
         }
         return intersects;
     },
-    
+
     /**
      * APIMethod: containsBounds
      * Determine whether the target bounds is contained within this bounds.
-     * 
+     *
      * bounds - {<OpenLayers.Bounds>} The target bounds.
      * partial - {Boolean} If any of the target corners is within this bounds
      *     consider the bounds contained.  Default is false.  If true, the
@@ -3494,7 +3494,7 @@
      *     true.
      *
      * Returns:
-     * {Boolean} The passed-in bounds object is contained within this bounds. 
+     * {Boolean} The passed-in bounds object is contained within this bounds.
      */
     containsBounds:function(bounds, partial, inclusive) {
         if (partial == null) {
@@ -3507,39 +3507,39 @@
         var bottomRight = this.contains(bounds.right, bounds.bottom, inclusive);
         var topLeft  = this.contains(bounds.left, bounds.top, inclusive);
         var topRight = this.contains(bounds.right, bounds.top, inclusive);
-        
+
         return (partial) ? (bottomLeft || bottomRight || topLeft || topRight)
                          : (bottomLeft && bottomRight && topLeft && topRight);
     },
 
-    /** 
+    /**
      * APIMethod: determineQuadrant
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
      * {String} The quadrant ("br" "tr" "tl" "bl") of the bounds in which the
      *     coordinate lies.
      */
     determineQuadrant: function(lonlat) {
-    
+
         var quadrant = "";
         var center = this.getCenterLonLat();
-        
+
         quadrant += (lonlat.lat < center.lat) ? "b" : "t";
         quadrant += (lonlat.lon < center.lon) ? "l" : "r";
-    
-        return quadrant; 
+
+        return quadrant;
     },
-    
+
     /**
      * APIMethod: transform
-     * Transform the Bounds object from source to dest. 
+     * Transform the Bounds object from source to dest.
      *
-     * Parameters: 
-     * source - {<OpenLayers.Projection>} Source projection. 
-     * dest   - {<OpenLayers.Projection>} Destination projection. 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} Source projection.
+     * dest   - {<OpenLayers.Projection>} Destination projection.
      *
      * Returns:
      * {<OpenLayers.Bounds>} Itself, for use in chaining operations.
@@ -3564,68 +3564,68 @@
 
     /**
      * APIMethod: wrapDateLine
-     *  
+     *
      * Parameters:
      * maxExtent - {<OpenLayers.Bounds>}
      * options - {Object} Some possible options are:
-     *                    leftTolerance - {float} Allow for a margin of error 
-     *                                            with the 'left' value of this 
+     *                    leftTolerance - {float} Allow for a margin of error
+     *                                            with the 'left' value of this
      *                                            bound.
      *                                            Default is 0.
-     *                    rightTolerance - {float} Allow for a margin of error 
-     *                                             with the 'right' value of 
+     *                    rightTolerance - {float} Allow for a margin of error
+     *                                             with the 'right' value of
      *                                             this bound.
      *                                             Default is 0.
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A copy of this bounds, but wrapped around the 
-     *                       "dateline" (as specified by the borders of 
-     *                       maxExtent). Note that this function only returns 
-     *                       a different bounds value if this bounds is 
-     *                       *entirely* outside of the maxExtent. If this 
-     *                       bounds straddles the dateline (is part in/part 
-     *                       out of maxExtent), the returned bounds will be 
+     * {<OpenLayers.Bounds>} A copy of this bounds, but wrapped around the
+     *                       "dateline" (as specified by the borders of
+     *                       maxExtent). Note that this function only returns
+     *                       a different bounds value if this bounds is
+     *                       *entirely* outside of the maxExtent. If this
+     *                       bounds straddles the dateline (is part in/part
+     *                       out of maxExtent), the returned bounds will be
      *                       merely a copy of this one.
      */
-    wrapDateLine: function(maxExtent, options) {    
+    wrapDateLine: function(maxExtent, options) {
         options = options || {};
-        
+
         var leftTolerance = options.leftTolerance || 0;
         var rightTolerance = options.rightTolerance || 0;
 
         var newBounds = this.clone();
-    
+
         if (maxExtent) {
 
            //shift right?
-           while ( newBounds.left < maxExtent.left && 
-                   (newBounds.right - rightTolerance) <= maxExtent.left ) { 
+           while ( newBounds.left < maxExtent.left &&
+                   (newBounds.right - rightTolerance) <= maxExtent.left ) {
                 newBounds = newBounds.add(maxExtent.getWidth(), 0);
            }
 
            //shift left?
-           while ( (newBounds.left + leftTolerance) >= maxExtent.right && 
-                   newBounds.right > maxExtent.right ) { 
+           while ( (newBounds.left + leftTolerance) >= maxExtent.right &&
+                   newBounds.right > maxExtent.right ) {
                 newBounds = newBounds.add(-maxExtent.getWidth(), 0);
            }
         }
-                
+
         return newBounds;
     },
 
     CLASS_NAME: "OpenLayers.Bounds"
 });
 
-/** 
+/**
  * APIFunction: fromString
- * Alternative constructor that builds a new OpenLayers.Bounds from a 
+ * Alternative constructor that builds a new OpenLayers.Bounds from a
  *     parameter string
- * 
- * Parameters: 
+ *
+ * Parameters:
  * str - {String}Comma-separated bounds string. (ex. <i>"5,42,10,45"</i>)
- * 
+ *
  * Returns:
- * {<OpenLayers.Bounds>} New bounds object built from the 
+ * {<OpenLayers.Bounds>} New bounds object built from the
  *                       passed-in String.
  */
 OpenLayers.Bounds.fromString = function(str) {
@@ -3633,11 +3633,11 @@
     return OpenLayers.Bounds.fromArray(bounds);
 };
 
-/** 
+/**
  * APIFunction: fromArray
  * Alternative constructor that builds a new OpenLayers.Bounds
  *     from an array
- * 
+ *
  * Parameters:
  * bbox - {Array(Float)} Array of bounds values (ex. <i>[5,42,10,45]</i>)
  *
@@ -3651,13 +3651,13 @@
                                  parseFloat(bbox[3]));
 };
 
-/** 
+/**
  * APIFunction: fromSize
  * Alternative constructor that builds a new OpenLayers.Bounds
  *     from a size
- * 
+ *
  * Parameters:
- * size - {<OpenLayers.Size>} 
+ * size - {<OpenLayers.Size>}
  *
  * Returns:
  * {<OpenLayers.Bounds>} New bounds object built from the passed-in size.
@@ -3677,16 +3677,16 @@
  * quadrant - {String} two character quadrant shortstring
  *
  * Returns:
- * {String} The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if 
- *          you pass in "bl" it returns "tr", if you pass in "br" it 
+ * {String} The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if
+ *          you pass in "bl" it returns "tr", if you pass in "br" it
  *          returns "tl", etc.
  */
 OpenLayers.Bounds.oppositeQuadrant = function(quadrant) {
     var opp = "";
-    
+
     opp += (quadrant.charAt(0) == 't') ? 'b' : 't';
     opp += (quadrant.charAt(1) == 'l') ? 'r' : 'l';
-    
+
     return opp;
 };
 /* ======================================================================
@@ -3704,10 +3704,10 @@
 
     /**
      * APIFunction: visible
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
      * {Boolean} Is the element visible?
      */
@@ -3718,14 +3718,14 @@
     /**
      * APIFunction: toggle
      * Toggle the visibility of element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
     toggle: function() {
         for (var i=0, len=arguments.length; i<len; i++) {
             var element = OpenLayers.Util.getElement(arguments[i]);
-            var display = OpenLayers.Element.visible(element) ? 'hide' 
+            var display = OpenLayers.Element.visible(element) ? 'hide'
                                                               : 'show';
             OpenLayers.Element[display](element);
         }
@@ -3735,7 +3735,7 @@
     /**
      * APIFunction: hide
      * Hide element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
@@ -3749,7 +3749,7 @@
     /**
      * APIFunction: show
      * Show element(s) passed in
-     * 
+     *
      * Parameters:
      * element - {DOMElement} Actually user can pass any number of elements
      */
@@ -3763,7 +3763,7 @@
     /**
      * APIFunction: remove
      * Remove the specified element from the DOM.
-     * 
+     *
      * Parameters:
      * element - {DOMElement}
      */
@@ -3774,10 +3774,10 @@
 
     /**
      * APIFunction: getHeight
-     *  
+     *
      * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer} The offset height of the element passed in
      */
@@ -3788,12 +3788,12 @@
 
     /**
      * APIFunction: getDimensions
-     *  
+     *
      * Parameters:
      * element - {DOMElement}
-     * 
+     *
      * Returns:
-     * {Object} Object with 'width' and 'height' properties which are the 
+     * {Object} Object with 'width' and 'height' properties which are the
      *          dimensions of the element passed in.
      */
     getDimensions: function(element) {
@@ -3801,7 +3801,7 @@
         if (OpenLayers.Element.getStyle(element, 'display') != 'none') {
             return {width: element.offsetWidth, height: element.offsetHeight};
         }
-    
+
         // All *Width and *Height properties give 0 on elements with display none,
         // so enable the element temporarily
         var els = element.style;
@@ -3833,7 +3833,7 @@
         var names = element.className;
         return (!!names && new RegExp("(^|\\s)" + name + "(\\s|$)").test(names));
     },
-    
+
     /**
      * Function: addClass
      * Add a CSS class name to an element.  Safe where element already has
@@ -3900,11 +3900,11 @@
 
     /**
      * APIFunction: getStyle
-     * 
+     *
      * Parameters:
      * element - {DOMElement}
      * style - {?}
-     * 
+     *
      * Returns:
      * {?}
      */
@@ -3915,24 +3915,24 @@
         if (element && element.style) {
             value = element.style[OpenLayers.String.camelize(style)];
             if (!value) {
-                if (document.defaultView && 
+                if (document.defaultView &&
                     document.defaultView.getComputedStyle) {
-                    
+
                     var css = document.defaultView.getComputedStyle(element, null);
                     value = css ? css.getPropertyValue(style) : null;
                 } else if (element.currentStyle) {
                     value = element.currentStyle[OpenLayers.String.camelize(style)];
                 }
             }
-        
+
             var positions = ['left', 'top', 'right', 'bottom'];
             if (window.opera &&
                 (OpenLayers.Util.indexOf(positions,style) != -1) &&
-                (OpenLayers.Element.getStyle(element, 'position') == 'static')) { 
+                (OpenLayers.Element.getStyle(element, 'position') == 'static')) {
                 value = 'auto';
             }
         }
-    
+
         return value == 'auto' ? null : value;
     }
 
@@ -3955,13 +3955,13 @@
  */
 OpenLayers.LonLat = OpenLayers.Class({
 
-    /** 
+    /**
      * APIProperty: lon
      * {Float} The x-axis coodinate in map units
      */
     lon: 0.0,
-    
-    /** 
+
+    /**
      * APIProperty: lat
      * {Float} The y-axis coordinate in map units
      */
@@ -3983,51 +3983,51 @@
         this.lon = OpenLayers.Util.toFloat(lon);
         this.lat = OpenLayers.Util.toFloat(lat);
     },
-    
+
     /**
      * Method: toString
      * Return a readable string version of the lonlat
      *
      * Returns:
-     * {String} String representation of OpenLayers.LonLat object. 
+     * {String} String representation of OpenLayers.LonLat object.
      *           (ex. <i>"lon=5,lat=42"</i>)
      */
     toString:function() {
         return ("lon=" + this.lon + ",lat=" + this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: toShortString
-     * 
+     *
      * Returns:
-     * {String} Shortened String representation of OpenLayers.LonLat object. 
+     * {String} Shortened String representation of OpenLayers.LonLat object.
      *         (ex. <i>"5, 42"</i>)
      */
     toShortString:function() {
         return (this.lon + ", " + this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: clone
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} New OpenLayers.LonLat object with the same lon 
+     * {<OpenLayers.LonLat>} New OpenLayers.LonLat object with the same lon
      *                       and lat values
      */
     clone:function() {
         return new OpenLayers.LonLat(this.lon, this.lat);
     },
 
-    /** 
+    /**
      * APIMethod: add
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} A new OpenLayers.LonLat object with the lon and 
-     *                       lat passed-in added to this's. 
+     * {<OpenLayers.LonLat>} A new OpenLayers.LonLat object with the lon and
+     *                       lat passed-in added to this's.
      */
     add:function(lon, lat) {
         if ( (lon == null) || (lat == null) ) {
@@ -4038,15 +4038,15 @@
         return new OpenLayers.LonLat(this.lon + lon, this.lat + lat);
     },
 
-    /** 
+    /**
      * APIMethod: equals
-     * 
+     *
      * Parameters:
      * ll - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {Boolean} Boolean value indicating whether the passed-in 
-     *           <OpenLayers.LonLat> object has the same lon and lat 
+     * {Boolean} Boolean value indicating whether the passed-in
+     *           <OpenLayers.LonLat> object has the same lon and lat
      *           components as this.
      *           Note: if ll passed in is null, returns false
      */
@@ -4064,9 +4064,9 @@
      * Transform the LonLat object from source to dest. This transformation is
      *    *in place*: if you want a *new* lonlat, use .clone() first.
      *
-     * Parameters: 
-     * source - {<OpenLayers.Projection>} Source projection. 
-     * dest   - {<OpenLayers.Projection>} Destination projection. 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} Source projection.
+     * dest   - {<OpenLayers.Projection>} Destination projection.
      *
      * Returns:
      * {<OpenLayers.LonLat>} Itself, for use in chaining operations.
@@ -4078,56 +4078,56 @@
         this.lat = point.y;
         return this;
     },
-    
+
     /**
      * APIMethod: wrapDateLine
-     * 
+     *
      * Parameters:
      * maxExtent - {<OpenLayers.Bounds>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} A copy of this lonlat, but wrapped around the 
-     *                       "dateline" (as specified by the borders of 
+     * {<OpenLayers.LonLat>} A copy of this lonlat, but wrapped around the
+     *                       "dateline" (as specified by the borders of
      *                       maxExtent)
      */
-    wrapDateLine: function(maxExtent) {    
+    wrapDateLine: function(maxExtent) {
 
         var newLonLat = this.clone();
-    
+
         if (maxExtent) {
             //shift right?
             while (newLonLat.lon < maxExtent.left) {
                 newLonLat.lon +=  maxExtent.getWidth();
-            }    
-           
+            }
+
             //shift left?
             while (newLonLat.lon > maxExtent.right) {
                 newLonLat.lon -= maxExtent.getWidth();
-            }    
+            }
         }
-                
+
         return newLonLat;
     },
 
     CLASS_NAME: "OpenLayers.LonLat"
 });
 
-/** 
+/**
  * Function: fromString
- * Alternative constructor that builds a new <OpenLayers.LonLat> from a 
+ * Alternative constructor that builds a new <OpenLayers.LonLat> from a
  *     parameter string
- * 
+ *
  * Parameters:
- * str - {String} Comma-separated Lon,Lat coordinate string. 
+ * str - {String} Comma-separated Lon,Lat coordinate string.
  *                 (ex. <i>"5,40"</i>)
- * 
+ *
  * Returns:
- * {<OpenLayers.LonLat>} New <OpenLayers.LonLat> object built from the 
+ * {<OpenLayers.LonLat>} New <OpenLayers.LonLat> object built from the
  *                       passed-in String.
  */
 OpenLayers.LonLat.fromString = function(str) {
     var pair = str.split(",");
-    return new OpenLayers.LonLat(parseFloat(pair[0]), 
+    return new OpenLayers.LonLat(parseFloat(pair[0]),
                                  parseFloat(pair[1]));
 };
 /* ======================================================================
@@ -4147,7 +4147,7 @@
  * This class represents a screen coordinate, in x and y coordinates
  */
 OpenLayers.Pixel = OpenLayers.Class({
-    
+
     /**
      * APIProperty: x
      * {Number} The x coordinate
@@ -4159,7 +4159,7 @@
      * {Number} The y coordinate
      */
     y: 0.0,
-    
+
     /**
      * Constructor: OpenLayers.Pixel
      * Create a new OpenLayers.Pixel instance
@@ -4175,7 +4175,7 @@
         this.x = parseFloat(x);
         this.y = parseFloat(y);
     },
-    
+
     /**
      * Method: toString
      * Cast this object into a string
@@ -4195,9 +4195,9 @@
      * {<OpenLayers.Pixel>} A clone pixel
      */
     clone:function() {
-        return new OpenLayers.Pixel(this.x, this.y); 
+        return new OpenLayers.Pixel(this.x, this.y);
     },
-    
+
     /**
      * APIMethod: equals
      * Determine whether one pixel is equivalent to another
@@ -4226,7 +4226,7 @@
      * y - {Integer}
      *
      * Returns:
-     * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the 
+     * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the
      * values passed in.
      */
     add:function(x, y) {
@@ -4240,12 +4240,12 @@
 
     /**
     * APIMethod: offset
-    * 
+    *
     * Parameters
     * px - {<OpenLayers.Pixel>}
-    * 
+    *
     * Returns:
-    * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the 
+    * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the
     *                      x&y values of the pixel passed in.
     */
     offset:function(px) {
@@ -4269,62 +4269,62 @@
 
 /**
  * Class: OpenLayers.Icon
- * 
+ *
  * The icon represents a graphical icon on the screen.  Typically used in
  * conjunction with a <OpenLayers.Marker> to represent markers on a screen.
  *
- * An icon has a url, size and position.  It also contains an offset which 
+ * An icon has a url, size and position.  It also contains an offset which
  * allows the center point to be represented correctly.  This can be
  * provided either as a fixed offset or a function provided to calculate
- * the desired offset. 
- * 
+ * the desired offset.
+ *
  */
 OpenLayers.Icon = OpenLayers.Class({
-    
-    /** 
-     * Property: url 
+
+    /**
+     * Property: url
      * {String}  image url
      */
     url: null,
-    
-    /** 
-     * Property: size 
-     * {<OpenLayers.Size>} 
+
+    /**
+     * Property: size
+     * {<OpenLayers.Size>}
      */
     size: null,
 
-    /** 
-     * Property: offset 
+    /**
+     * Property: offset
      * {<OpenLayers.Pixel>} distance in pixels to offset the image when being rendered
      */
-    offset: null,    
-    
-    /** 
-     * Property: calculateOffset 
-     * {<OpenLayers.Pixel>} Function to calculate the offset (based on the size) 
+    offset: null,
+
+    /**
+     * Property: calculateOffset
+     * {<OpenLayers.Pixel>} Function to calculate the offset (based on the size)
      */
-    calculateOffset: null,    
-    
-    /** 
-     * Property: imageDiv 
-     * {DOMElement} 
+    calculateOffset: null,
+
+    /**
+     * Property: imageDiv
+     * {DOMElement}
      */
     imageDiv: null,
 
-    /** 
-     * Property: px 
-     * {<OpenLayers.Pixel>} 
+    /**
+     * Property: px
+     * {<OpenLayers.Pixel>}
      */
     px: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Icon
-     * Creates an icon, which is an image tag in a div.  
+     * Creates an icon, which is an image tag in a div.
      *
-     * url - {String} 
-     * size - {<OpenLayers.Size>} 
+     * url - {String}
+     * size - {<OpenLayers.Size>}
      * offset - {<OpenLayers.Pixel>}
-     * calculateOffset - {Function} 
+     * calculateOffset - {Function}
      */
     initialize: function(url, size, offset, calculateOffset) {
         this.url = url;
@@ -4335,39 +4335,39 @@
         var id = OpenLayers.Util.createUniqueID("OL_Icon_");
         this.imageDiv = OpenLayers.Util.createAlphaImageDiv(id);
     },
-    
-    /** 
+
+    /**
      * Method: destroy
-     * Nullify references and remove event listeners to prevent circular 
+     * Nullify references and remove event listeners to prevent circular
      * references and memory leaks
      */
     destroy: function() {
         // erase any drawn elements
         this.erase();
 
-        OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); 
+        OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);
         this.imageDiv.innerHTML = "";
         this.imageDiv = null;
     },
 
-    /** 
+    /**
      * Method: clone
-     * 
+     *
      * Returns:
      * {<OpenLayers.Icon>} A fresh copy of the icon.
      */
     clone: function() {
-        return new OpenLayers.Icon(this.url, 
-                                   this.size, 
-                                   this.offset, 
+        return new OpenLayers.Icon(this.url,
+                                   this.size,
+                                   this.offset,
                                    this.calculateOffset);
     },
-    
+
     /**
      * Method: setSize
-     * 
+     *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         if (size != null) {
@@ -4375,12 +4375,12 @@
         }
         this.draw();
     },
-    
+
     /**
      * Method: setUrl
-     * 
+     *
      * Parameters:
-     * url - {String} 
+     * url - {String}
      */
     setUrl: function(url) {
         if (url != null) {
@@ -4389,28 +4389,28 @@
         this.draw();
     },
 
-    /** 
+    /**
      * Method: draw
      * Move the div to the given pixel.
-     * 
+     *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
-     * 
+     * px - {<OpenLayers.Pixel>}
+     *
      * Returns:
      * {DOMElement} A new DOM Image of this icon set at the location passed-in
      */
     draw: function(px) {
-        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, 
-                                            null, 
-                                            null, 
-                                            this.size, 
-                                            this.url, 
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,
+                                            null,
+                                            null,
+                                            this.size,
+                                            this.url,
                                             "absolute");
         this.moveTo(px);
         return this.imageDiv;
-    }, 
+    },
 
-    /** 
+    /**
      * Method: erase
      * Erase the underlying image element.
      *
@@ -4419,27 +4419,27 @@
         if (this.imageDiv != null && this.imageDiv.parentNode != null) {
             OpenLayers.Element.remove(this.imageDiv);
         }
-    }, 
-    
-    /** 
+    },
+
+    /**
      * Method: setOpacity
      * Change the icon's opacity
      *
      * Parameters:
-     * opacity - {float} 
+     * opacity - {float}
      */
     setOpacity: function(opacity) {
-        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, 
+        OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null,
                                             null, null, null, null, opacity);
 
     },
-    
+
     /**
      * Method: moveTo
      * move icon to passed in px.
      *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
+     * px - {<OpenLayers.Pixel>}
      */
     moveTo: function (px) {
         //if no px passed in, use stored location
@@ -4452,39 +4452,39 @@
                 this.display(false);
             } else {
                 if (this.calculateOffset) {
-                    this.offset = this.calculateOffset(this.size);  
+                    this.offset = this.calculateOffset(this.size);
                 }
                 var offsetPx = this.px.offset(this.offset);
                 OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, offsetPx);
             }
         }
     },
-    
-    /** 
+
+    /**
      * Method: display
      * Hide or show the icon
      *
      * Parameters:
-     * display - {Boolean} 
+     * display - {Boolean}
      */
     display: function(display) {
-        this.imageDiv.style.display = (display) ? "" : "none"; 
+        this.imageDiv.style.display = (display) ? "" : "none";
     },
-    
 
+
     /**
      * APIMethod: isDrawn
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the icon is drawn.
      */
     isDrawn: function() {
         // nodeType 11 for ie, whose nodes *always* have a parentNode
         // (of type document fragment)
-        var isDrawn = (this.imageDiv && this.imageDiv.parentNode && 
-                       (this.imageDiv.parentNode.nodeType != 11));    
+        var isDrawn = (this.imageDiv && this.imageDiv.parentNode &&
+                       (this.imageDiv.parentNode.nodeType != 11));
 
-        return isDrawn;   
+        return isDrawn;
     },
 
     CLASS_NAME: "OpenLayers.Icon"
@@ -4501,104 +4501,104 @@
 /**
  * Class: OpenLayers.Popup
  * A popup is a small div that can opened and closed on the map.
- * Typically opened in response to clicking on a marker.  
+ * Typically opened in response to clicking on a marker.
  * See <OpenLayers.Marker>.  Popup's don't require their own
  * layer and are added the the map using the <OpenLayers.Map.addPopup>
  * method.
  *
  * Example:
  * (code)
- * popup = new OpenLayers.Popup("chicken", 
+ * popup = new OpenLayers.Popup("chicken",
  *                    new OpenLayers.LonLat(5,40),
  *                    new OpenLayers.Size(200,200),
  *                    "example popup",
  *                    true);
- *       
+ *
  * map.addPopup(popup);
  * (end)
  */
 OpenLayers.Popup = OpenLayers.Class({
 
-    /** 
-     * Property: events  
-     * {<OpenLayers.Events>} custom event manager 
+    /**
+     * Property: events
+     * {<OpenLayers.Events>} custom event manager
      */
     events: null,
-    
+
     /** Property: id
      * {String} the unique identifier assigned to this popup.
      */
     id: "",
 
-    /** 
-     * Property: lonlat 
+    /**
+     * Property: lonlat
      * {<OpenLayers.LonLat>} the position of this popup on the map
      */
     lonlat: null,
 
-    /** 
-     * Property: div 
+    /**
+     * Property: div
      * {DOMElement} the div that contains this popup.
      */
     div: null,
 
-    /** 
-     * Property: contentSize 
+    /**
+     * Property: contentSize
      * {<OpenLayers.Size>} the width and height of the content.
      */
-    contentSize: null,    
+    contentSize: null,
 
-    /** 
-     * Property: size 
+    /**
+     * Property: size
      * {<OpenLayers.Size>} the width and height of the popup.
      */
-    size: null,    
+    size: null,
 
-    /** 
-     * Property: contentHTML 
+    /**
+     * Property: contentHTML
      * {String} An HTML string for this popup to display.
      */
     contentHTML: null,
-    
-    /** 
-     * Property: backgroundColor 
+
+    /**
+     * Property: backgroundColor
      * {String} the background color used by the popup.
      */
     backgroundColor: "",
-    
-    /** 
-     * Property: opacity 
+
+    /**
+     * Property: opacity
      * {float} the opacity of this popup (between 0.0 and 1.0)
      */
     opacity: "",
 
-    /** 
-     * Property: border 
+    /**
+     * Property: border
      * {String} the border size of the popup.  (eg 2px)
      */
     border: "",
-    
-    /** 
-     * Property: contentDiv 
+
+    /**
+     * Property: contentDiv
      * {DOMElement} a reference to the element that holds the content of
      *              the div.
      */
     contentDiv: null,
-    
-    /** 
-     * Property: groupDiv 
+
+    /**
+     * Property: groupDiv
      * {DOMElement} First and only child of 'div'. The group Div contains the
      *     'contentDiv' and the 'closeDiv'.
      */
     groupDiv: null,
 
-    /** 
+    /**
      * Property: closeDiv
      * {DOMElement} the optional closer image
      */
     closeDiv: null,
 
-    /** 
+    /**
      * APIProperty: autoSize
      * {Boolean} Resize the popup to auto-fit the contents.
      *     Default is false.
@@ -4617,40 +4617,40 @@
      */
     maxSize: null,
 
-    /** 
+    /**
      * Property: displayClass
      * {String} The CSS class of the popup.
      */
     displayClass: "olPopup",
 
-    /** 
+    /**
      * Property: contentDisplayClass
      * {String} The CSS class of the popup content div.
      */
     contentDisplayClass: "olPopupContent",
 
-    /** 
-     * Property: padding 
-     * {int or <OpenLayers.Bounds>} An extra opportunity to specify internal 
+    /**
+     * Property: padding
+     * {int or <OpenLayers.Bounds>} An extra opportunity to specify internal
      *     padding of the content div inside the popup. This was originally
-     *     confused with the css padding as specified in style.css's 
+     *     confused with the css padding as specified in style.css's
      *     'olPopupContent' class. We would like to get rid of this altogether,
      *     except that it does come in handy for the framed and anchoredbubble
-     *     popups, who need to maintain yet another barrier between their 
-     *     content and the outer border of the popup itself. 
-     * 
-     *     Note that in order to not break API, we must continue to support 
-     *     this property being set as an integer. Really, though, we'd like to 
+     *     popups, who need to maintain yet another barrier between their
+     *     content and the outer border of the popup itself.
+     *
+     *     Note that in order to not break API, we must continue to support
+     *     this property being set as an integer. Really, though, we'd like to
      *     have this specified as a Bounds object so that user can specify
      *     distinct left, top, right, bottom paddings. With the 3.0 release
      *     we can make this only a bounds.
      */
     padding: 0,
 
-    /** 
+    /**
      * Property: disableFirefoxOverflowHack
-     * {Boolean} The hack for overflow in Firefox causes all elements 
-     *     to be re-drawn, which causes Flash elements to be 
+     * {Boolean} The hack for overflow in Firefox causes all elements
+     *     to be re-drawn, which causes Flash elements to be
      *     re-initialized, which is troublesome.
      *     With this property the hack can be disabled.
      */
@@ -4658,8 +4658,8 @@
 
     /**
      * Method: fixPadding
-     * To be removed in 3.0, this function merely helps us to deal with the 
-     *     case where the user may have set an integer value for padding, 
+     * To be removed in 3.0, this function merely helps us to deal with the
+     *     case where the user may have set an integer value for padding,
      *     instead of an <OpenLayers.Bounds> object.
      */
     fixPadding: function() {
@@ -4677,17 +4677,17 @@
      *     Default is false.
      */
     panMapIfOutOfView: false,
-    
+
     /**
-     * APIProperty: keepInMap 
-     * {Boolean} If panMapIfOutOfView is false, and this property is true, 
+     * APIProperty: keepInMap
+     * {Boolean} If panMapIfOutOfView is false, and this property is true,
      *     contrain the popup such that it always fits in the available map
      *     space. By default, this is not set on the base class. If you are
      *     creating popups that are near map edges and not allowing pannning,
      *     and especially if you have a popup which has a
      *     fixedRelativePosition, setting this to false may be a smart thing to
      *     do. Subclasses may want to override this setting.
-     *   
+     *
      *     Default is false.
      */
     keepInMap: false,
@@ -4698,24 +4698,24 @@
      *     Default is false.
      */
     closeOnMove: false,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} this gets set in Map.js when the popup is added to the map
      */
     map: null,
 
-    /** 
+    /**
     * Constructor: OpenLayers.Popup
     * Create a popup.
-    * 
-    * Parameters: 
+    *
+    * Parameters:
     * id - {String} a unqiue identifier for this popup.  If null is passed
-    *               an identifier will be automatically generated. 
+    *               an identifier will be automatically generated.
     * lonlat - {<OpenLayers.LonLat>}  The position on the map the popup will
     *                                 be shown.
     * contentSize - {<OpenLayers.Size>} The size of the content.
-    * contentHTML - {String}          An HTML string to display inside the   
+    * contentHTML - {String}          An HTML string to display inside the
     *                                 popup.
     * closeBox - {Boolean}            Whether to display a close box inside
     *                                 the popup.
@@ -4729,28 +4729,28 @@
         this.id = id;
         this.lonlat = lonlat;
 
-        this.contentSize = (contentSize != null) ? contentSize 
+        this.contentSize = (contentSize != null) ? contentSize
                                   : new OpenLayers.Size(
                                                    OpenLayers.Popup.WIDTH,
                                                    OpenLayers.Popup.HEIGHT);
-        if (contentHTML != null) { 
+        if (contentHTML != null) {
              this.contentHTML = contentHTML;
         }
         this.backgroundColor = OpenLayers.Popup.COLOR;
         this.opacity = OpenLayers.Popup.OPACITY;
         this.border = OpenLayers.Popup.BORDER;
 
-        this.div = OpenLayers.Util.createDiv(this.id, null, null, 
+        this.div = OpenLayers.Util.createDiv(this.id, null, null,
                                              null, null, null, "hidden");
         this.div.className = this.displayClass;
-        
+
         var groupDivId = this.id + "_GroupDiv";
-        this.groupDiv = OpenLayers.Util.createDiv(groupDivId, null, null, 
+        this.groupDiv = OpenLayers.Util.createDiv(groupDivId, null, null,
                                                     null, "relative", null,
                                                     "hidden");
 
         var id = this.div.id + "_contentDiv";
-        this.contentDiv = OpenLayers.Util.createDiv(id, null, this.contentSize.clone(), 
+        this.contentDiv = OpenLayers.Util.createDiv(id, null, this.contentSize.clone(),
                                                     null, "relative");
         this.contentDiv.className = this.contentDisplayClass;
         this.groupDiv.appendChild(this.contentDiv);
@@ -4758,12 +4758,12 @@
 
         if (closeBox) {
             this.addCloseBox(closeBoxCallback);
-        } 
+        }
 
         this.registerEvents();
     },
 
-    /** 
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -4773,24 +4773,24 @@
         this.lonlat = null;
         this.size = null;
         this.contentHTML = null;
-        
+
         this.backgroundColor = null;
         this.opacity = null;
         this.border = null;
-        
+
         if (this.closeOnMove && this.map) {
             this.map.events.unregister("movestart", this, this.hide);
         }
 
         this.events.destroy();
         this.events = null;
-        
+
         if (this.closeDiv) {
-            OpenLayers.Event.stopObservingElement(this.closeDiv); 
+            OpenLayers.Event.stopObservingElement(this.closeDiv);
             this.groupDiv.removeChild(this.closeDiv);
         }
         this.closeDiv = null;
-        
+
         this.div.removeChild(this.groupDiv);
         this.groupDiv = null;
 
@@ -4799,7 +4799,7 @@
         }
         this.map = null;
         this.div = null;
-        
+
         this.autoSize = null;
         this.minSize = null;
         this.maxSize = null;
@@ -4807,13 +4807,13 @@
         this.panMapIfOutOfView = null;
     },
 
-    /** 
+    /**
     * Method: draw
     * Constructs the elements that make up the popup.
     *
     * Parameters:
     * px - {<OpenLayers.Pixel>} the position the popup in pixels.
-    * 
+    *
     * Returns:
     * {DOMElement} Reference to a div that contains the drawn popup
     */
@@ -4824,12 +4824,12 @@
             }
         }
 
-        // this assumes that this.map already exists, which is okay because 
+        // this assumes that this.map already exists, which is okay because
         // this.draw is only called once the popup has been added to the map.
         if (this.closeOnMove) {
             this.map.events.register("movestart", this, this.hide);
         }
-        
+
         //listen to movestart, moveend to disable overflow (FF bug)
         if (!this.disableFirefoxOverflowHack && OpenLayers.Util.getBrowserName() == 'firefox') {
             this.map.events.register("movestart", this, function() {
@@ -4859,33 +4859,33 @@
         this.setOpacity();
         this.setBorder();
         this.setContentHTML();
-        
+
         if (this.panMapIfOutOfView) {
             this.panIntoView();
-        }    
+        }
 
         return this.div;
     },
 
-    /** 
+    /**
      * Method: updatePosition
-     * if the popup has a lonlat and its map members set, 
+     * if the popup has a lonlat and its map members set,
      * then have it move itself to its proper position
      */
     updatePosition: function() {
         if ((this.lonlat) && (this.map)) {
             var px = this.map.getLayerPxFromLonLat(this.lonlat);
             if (px) {
-                this.moveTo(px);           
-            }    
+                this.moveTo(px);
+            }
         }
     },
 
     /**
      * Method: moveTo
-     * 
+     *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} the top and left position of the popup div. 
+     * px - {<OpenLayers.Pixel>} the top and left position of the popup div.
      */
     moveTo: function(px) {
         if ((px != null) && (this.div != null)) {
@@ -4897,7 +4897,7 @@
     /**
      * Method: visible
      *
-     * Returns:      
+     * Returns:
      * {Boolean} Boolean indicating whether or not the popup is visible
      */
     visible: function() {
@@ -4925,7 +4925,7 @@
 
         if (this.panMapIfOutOfView) {
             this.panIntoView();
-        }    
+        }
     },
 
     /**
@@ -4938,17 +4938,17 @@
 
     /**
      * Method: setSize
-     * Used to adjust the size of the popup. 
+     * Used to adjust the size of the popup.
      *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
-        this.size = contentSize.clone(); 
-        
-        // if our contentDiv has a css 'padding' set on it by a stylesheet, we 
-        //  must add that to the desired "size". 
+    setSize:function(contentSize) {
+        this.size = contentSize.clone();
+
+        // if our contentDiv has a css 'padding' set on it by a stylesheet, we
+        //  must add that to the desired "size".
         var contentDivPadding = this.getContentDivPadding();
         var wPadding = contentDivPadding.left + contentDivPadding.right;
         var hPadding = contentDivPadding.top + contentDivPadding.bottom;
@@ -4964,18 +4964,18 @@
             wPadding += closeDivWidth + contentDivPadding.right;
         }
 
-        //increase size of the main popup div to take into account the 
-        // users's desired padding and close div.        
+        //increase size of the main popup div to take into account the
+        // users's desired padding and close div.
         this.size.w += wPadding;
         this.size.h += hPadding;
 
-        //now if our browser is IE, we need to actually make the contents 
-        // div itself bigger to take its own padding into effect. this makes 
+        //now if our browser is IE, we need to actually make the contents
+        // div itself bigger to take its own padding into effect. this makes
         // me want to shoot someone, but so it goes.
         if (OpenLayers.Util.getBrowserName() == "msie") {
-            this.contentSize.w += 
+            this.contentSize.w +=
                 contentDivPadding.left + contentDivPadding.right;
-            this.contentSize.h += 
+            this.contentSize.h +=
                 contentDivPadding.bottom + contentDivPadding.top;
         }
 
@@ -4987,26 +4987,26 @@
             this.contentDiv.style.width = contentSize.w + "px";
             this.contentDiv.style.height = contentSize.h + "px";
         }
-    },  
+    },
 
     /**
      * APIMethod: updateSize
-     * Auto size the popup so that it precisely fits its contents (as 
+     * Auto size the popup so that it precisely fits its contents (as
      *     determined by this.contentDiv.innerHTML). Popup size will, of
      *     course, be limited by the available space on the current map
      */
     updateSize: function() {
-        
+
         // determine actual render dimensions of the contents by putting its
         // contents into a fake contentDiv (for the CSS) and then measuring it
-        var preparedHTML = "<div class='" + this.contentDisplayClass+ "'>" + 
-            this.contentDiv.innerHTML + 
+        var preparedHTML = "<div class='" + this.contentDisplayClass+ "'>" +
+            this.contentDiv.innerHTML +
             "</div>";
- 
+
         var containerElement = (this.map) ? this.map.layerContainerDiv
-        								  : document.body;
+                                          : document.body;
         var realSize = OpenLayers.Util.getRenderedDimensions(
-            preparedHTML, null,	{
+            preparedHTML, null, {
                 displayClass: this.displayClass,
                 containerElement: containerElement
             }
@@ -5017,25 +5017,25 @@
 
         var newSize = null;
         if (safeSize.equals(realSize)) {
-            //real size of content is small enough to fit on the map, 
+            //real size of content is small enough to fit on the map,
             // so we use real size.
             newSize = realSize;
 
         } else {
 
-            //make a new OL.Size object with the clipped dimensions 
+            //make a new OL.Size object with the clipped dimensions
             // set or null if not clipped.
             var fixedSize = new OpenLayers.Size();
             fixedSize.w = (safeSize.w < realSize.w) ? safeSize.w : null;
             fixedSize.h = (safeSize.h < realSize.h) ? safeSize.h : null;
-        
+
             if (fixedSize.w && fixedSize.h) {
-                //content is too big in both directions, so we will use 
-                // max popup size (safeSize), knowing well that it will 
-                // overflow both ways.                
+                //content is too big in both directions, so we will use
+                // max popup size (safeSize), knowing well that it will
+                // overflow both ways.
                 newSize = safeSize;
             } else {
-                //content is clipped in only one direction, so we need to 
+                //content is clipped in only one direction, so we need to
                 // run getRenderedDimensions() again with a fixed dimension
                 var clippedSize = OpenLayers.Util.getRenderedDimensions(
                     preparedHTML, fixedSize, {
@@ -5043,17 +5043,17 @@
                         containerElement: containerElement
                     }
                 );
-                
-                //if the clipped size is still the same as the safeSize, 
-                // that means that our content must be fixed in the 
-                // offending direction. If overflow is 'auto', this means 
-                // we are going to have a scrollbar for sure, so we must 
+
+                //if the clipped size is still the same as the safeSize,
+                // that means that our content must be fixed in the
+                // offending direction. If overflow is 'auto', this means
+                // we are going to have a scrollbar for sure, so we must
                 // adjust for that.
                 //
                 var currentOverflow = OpenLayers.Element.getStyle(
                     this.contentDiv, "overflow"
                 );
-                if ( (currentOverflow != "hidden") && 
+                if ( (currentOverflow != "hidden") &&
                      (clippedSize.equals(safeSize)) ) {
                     var scrollBar = OpenLayers.Util.getScrollbarWidth();
                     if (fixedSize.w) {
@@ -5062,12 +5062,12 @@
                         clippedSize.w += scrollBar;
                     }
                 }
-                
+
                 newSize = this.getSafeContentSize(clippedSize);
             }
-        }                        
-        this.setSize(newSize);     
-    },    
+        }
+        this.setSize(newSize);
+    },
 
     /**
      * Method: setBackgroundColor
@@ -5076,28 +5076,28 @@
      * Parameters:
      * color - {String} the background color.  eg "#FFBBBB"
      */
-    setBackgroundColor:function(color) { 
+    setBackgroundColor:function(color) {
         if (color != undefined) {
-            this.backgroundColor = color; 
+            this.backgroundColor = color;
         }
-        
+
         if (this.div != null) {
             this.div.style.backgroundColor = this.backgroundColor;
         }
-    },  
-    
+    },
+
     /**
      * Method: setOpacity
      * Sets the opacity of the popup.
-     * 
+     *
      * Parameters:
-     * opacity - {float} A value between 0.0 (transparent) and 1.0 (solid).   
+     * opacity - {float} A value between 0.0 (transparent) and 1.0 (solid).
      */
-    setOpacity:function(opacity) { 
+    setOpacity:function(opacity) {
         if (opacity != undefined) {
-            this.opacity = opacity; 
+            this.opacity = opacity;
         }
-        
+
         if (this.div != null) {
             // for Mozilla and Safari
             this.div.style.opacity = this.opacity;
@@ -5105,25 +5105,25 @@
             // for IE
             this.div.style.filter = 'alpha(opacity=' + this.opacity*100 + ')';
         }
-    },  
-    
+    },
+
     /**
      * Method: setBorder
      * Sets the border style of the popup.
      *
      * Parameters:
-     * border - {String} The border style value. eg 2px 
+     * border - {String} The border style value. eg 2px
      */
-    setBorder:function(border) { 
+    setBorder:function(border) {
         if (border != undefined) {
             this.border = border;
         }
-        
+
         if (this.div != null) {
             this.div.style.border = this.border;
         }
-    },      
-    
+    },
+
     /**
      * Method: setContentHTML
      * Allows the user to set the HTML content of the popup.
@@ -5136,15 +5136,15 @@
         if (contentHTML != null) {
             this.contentHTML = contentHTML;
         }
-       
-        if ((this.contentDiv != null) && 
+
+        if ((this.contentDiv != null) &&
             (this.contentHTML != null) &&
             (this.contentHTML != this.contentDiv.innerHTML)) {
-       
+
             this.contentDiv.innerHTML = this.contentHTML;
-       
+
             if (this.autoSize) {
-                
+
                 //if popup has images, listen for when they finish
                 // loading and resize accordingly
                 this.registerImageListeners();
@@ -5152,31 +5152,31 @@
                 //auto size the popup to its current contents
                 this.updateSize();
             }
-        }    
+        }
 
     },
-    
+
     /**
      * Method: registerImageListeners
      * Called when an image contained by the popup loaded. this function
      *     updates the popup size, then unregisters the image load listener.
-     */   
-    registerImageListeners: function() { 
+     */
+    registerImageListeners: function() {
 
-        // As the images load, this function will call updateSize() to 
+        // As the images load, this function will call updateSize() to
         // resize the popup to fit the content div (which presumably is now
         // bigger than when the image was not loaded).
-        // 
+        //
         // If the 'panMapIfOutOfView' property is set, we will pan the newly
         // resized popup back into view.
-        // 
-        // Note that this function, when called, will have 'popup' and 
+        //
+        // Note that this function, when called, will have 'popup' and
         // 'img' properties in the context.
         //
         var onImgLoad = function() {
-            
+
             this.popup.updateSize();
-     
+
             if ( this.popup.visible() && this.popup.panMapIfOutOfView ) {
                 this.popup.panIntoView();
             }
@@ -5184,12 +5184,12 @@
             OpenLayers.Event.stopObserving(
                 this.img, "load", this.img._onImageLoad
             );
-    
+
         };
 
-        //cycle through the images and if their size is 0x0, that means that 
-        // they haven't been loaded yet, so we attach the listener, which 
-        // will fire when the images finish loading and will resize the 
+        //cycle through the images and if their size is 0x0, that means that
+        // they haven't been loaded yet, so we attach the listener, which
+        // will fire when the images finish loading and will resize the
         // popup accordingly to its new size.
         var images = this.contentDiv.getElementsByTagName("img");
         for (var i = 0, len = images.length; i < len; i++) {
@@ -5206,27 +5206,27 @@
                 img._onImgLoad = OpenLayers.Function.bind(onImgLoad, context);
 
                 OpenLayers.Event.observe(img, 'load', img._onImgLoad);
-            }    
-        } 
+            }
+        }
     },
 
     /**
      * APIMethod: getSafeContentSize
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>} Desired size to make the popup.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Size>} A size to make the popup which is neither smaller
-     *     than the specified minimum size, nor bigger than the maximum 
+     *     than the specified minimum size, nor bigger than the maximum
      *     size (which is calculated relative to the size of the viewport).
      */
     getSafeContentSize: function(size) {
 
         var safeContentSize = size.clone();
 
-        // if our contentDiv has a css 'padding' set on it by a stylesheet, we 
-        //  must add that to the desired "size". 
+        // if our contentDiv has a css 'padding' set on it by a stylesheet, we
+        //  must add that to the desired "size".
         var contentDivPadding = this.getContentDivPadding();
         var wPadding = contentDivPadding.left + contentDivPadding.right;
         var hPadding = contentDivPadding.top + contentDivPadding.bottom;
@@ -5243,25 +5243,25 @@
 
         // prevent the popup from being smaller than a specified minimal size
         if (this.minSize) {
-            safeContentSize.w = Math.max(safeContentSize.w, 
+            safeContentSize.w = Math.max(safeContentSize.w,
                 (this.minSize.w - wPadding));
-            safeContentSize.h = Math.max(safeContentSize.h, 
+            safeContentSize.h = Math.max(safeContentSize.h,
                 (this.minSize.h - hPadding));
         }
 
         // prevent the popup from being bigger than a specified maximum size
         if (this.maxSize) {
-            safeContentSize.w = Math.min(safeContentSize.w, 
+            safeContentSize.w = Math.min(safeContentSize.w,
                 (this.maxSize.w - wPadding));
-            safeContentSize.h = Math.min(safeContentSize.h, 
+            safeContentSize.h = Math.min(safeContentSize.h,
                 (this.maxSize.h - hPadding));
         }
-        
-        //make sure the desired size to set doesn't result in a popup that 
+
+        //make sure the desired size to set doesn't result in a popup that
         // is bigger than the map's viewport.
         //
         if (this.map && this.map.size) {
-            
+
             var extraX = 0, extraY = 0;
             if (this.keepInMap && !this.panMapIfOutOfView) {
                 var px = this.map.getPixelFromLonLat(this.lonlat);
@@ -5282,39 +5282,39 @@
                         extraX = px.x;
                         extraY = px.y;
                         break;
-                    default:    
+                    default:
                         extraX = px.x;
                         extraY = this.map.size.h - px.y;
                         break;
                 }
-            }    
-          
-            var maxY = this.map.size.h - 
-                this.map.paddingForPopups.top - 
-                this.map.paddingForPopups.bottom - 
+            }
+
+            var maxY = this.map.size.h -
+                this.map.paddingForPopups.top -
+                this.map.paddingForPopups.bottom -
                 hPadding - extraY;
-            
-            var maxX = this.map.size.w - 
-                this.map.paddingForPopups.left - 
-                this.map.paddingForPopups.right - 
+
+            var maxX = this.map.size.w -
+                this.map.paddingForPopups.left -
+                this.map.paddingForPopups.right -
                 wPadding - extraX;
-            
+
             safeContentSize.w = Math.min(safeContentSize.w, maxX);
             safeContentSize.h = Math.min(safeContentSize.h, maxY);
         }
-        
+
         return safeContentSize;
     },
-    
+
     /**
      * Method: getContentDivPadding
-     * Glorious, oh glorious hack in order to determine the css 'padding' of 
-     *     the contentDiv. IE/Opera return null here unless we actually add the 
-     *     popup's main 'div' element (which contains contentDiv) to the DOM. 
-     *     So we make it invisible and then add it to the document temporarily. 
+     * Glorious, oh glorious hack in order to determine the css 'padding' of
+     *     the contentDiv. IE/Opera return null here unless we actually add the
+     *     popup's main 'div' element (which contains contentDiv) to the DOM.
+     *     So we make it invisible and then add it to the document temporarily.
      *
-     *     Once we've taken the padding readings we need, we then remove it 
-     *     from the DOM (it will actually get added to the DOM in 
+     *     Once we've taken the padding readings we need, we then remove it
+     *     from the DOM (it will actually get added to the DOM in
      *     Map.js's addPopup)
      *
      * Returns:
@@ -5326,27 +5326,27 @@
         var contentDivPadding = this._contentDivPadding;
         if (!contentDivPadding) {
 
-        	if (this.div.parentNode == null) {
-	        	//make the div invisible and add it to the page        
-	            this.div.style.display = "none";
-	            document.body.appendChild(this.div);
-	    	}
-	            
-            //read the padding settings from css, put them in an OL.Bounds        
+            if (this.div.parentNode == null) {
+                //make the div invisible and add it to the page
+                this.div.style.display = "none";
+                document.body.appendChild(this.div);
+            }
+
+            //read the padding settings from css, put them in an OL.Bounds
             contentDivPadding = new OpenLayers.Bounds(
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-left"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-bottom"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-right"),
                 OpenLayers.Element.getStyle(this.contentDiv, "padding-top")
             );
-    
+
             //cache the value
             this._contentDivPadding = contentDivPadding;
 
             if (this.div.parentNode == document.body) {
-	            //remove the div from the page and make it visible again
-	            document.body.removeChild(this.div);
-	            this.div.style.display = "";
+                //remove the div from the page and make it visible again
+                document.body.removeChild(this.div);
+                this.div.style.display = "";
             }
         }
         return contentDivPadding;
@@ -5354,7 +5354,7 @@
 
     /**
      * Method: addCloseBox
-     * 
+     *
      * Parameters:
      * callback - {Function} The callback to be called when the close button
      *     is clicked.
@@ -5364,12 +5364,12 @@
         this.closeDiv = OpenLayers.Util.createDiv(
             this.id + "_close", null, new OpenLayers.Size(17, 17)
         );
-        this.closeDiv.className = "olPopupCloseBox"; 
-        
+        this.closeDiv.className = "olPopupCloseBox";
+
         // use the content div's css padding to determine if we should
         //  padd the close div
         var contentDivPadding = this.getContentDivPadding();
-         
+
         this.closeDiv.style.right = contentDivPadding.right + "px";
         this.closeDiv.style.top = contentDivPadding.top + "px";
         this.groupDiv.appendChild(this.closeDiv);
@@ -5378,7 +5378,7 @@
             this.hide();
             OpenLayers.Event.stop(e);
         };
-        OpenLayers.Event.observe(this.closeDiv, "click", 
+        OpenLayers.Event.observe(this.closeDiv, "click",
                 OpenLayers.Function.bindAsEventListener(closePopup, this));
     },
 
@@ -5387,58 +5387,58 @@
      * Pans the map such that the popup is totaly viewable (if necessary)
      */
     panIntoView: function() {
-        
+
         var mapSize = this.map.getSize();
-    
-        //start with the top left corner of the popup, in px, 
+
+        //start with the top left corner of the popup, in px,
         // relative to the viewport
         var origTL = this.map.getViewPortPxFromLayerPx( new OpenLayers.Pixel(
             parseInt(this.div.style.left),
             parseInt(this.div.style.top)
         ));
         var newTL = origTL.clone();
-    
+
         //new left (compare to margins, using this.size to calculate right)
         if (origTL.x < this.map.paddingForPopups.left) {
             newTL.x = this.map.paddingForPopups.left;
-        } else 
+        } else
         if ( (origTL.x + this.size.w) > (mapSize.w - this.map.paddingForPopups.right)) {
             newTL.x = mapSize.w - this.map.paddingForPopups.right - this.size.w;
         }
-        
+
         //new top (compare to margins, using this.size to calculate bottom)
         if (origTL.y < this.map.paddingForPopups.top) {
             newTL.y = this.map.paddingForPopups.top;
-        } else 
+        } else
         if ( (origTL.y + this.size.h) > (mapSize.h - this.map.paddingForPopups.bottom)) {
             newTL.y = mapSize.h - this.map.paddingForPopups.bottom - this.size.h;
         }
-        
+
         var dx = origTL.x - newTL.x;
         var dy = origTL.y - newTL.y;
-        
+
         this.map.pan(dx, dy);
     },
 
-    /** 
+    /**
      * Method: registerEvents
      * Registers events on the popup.
      *
-     * Do this in a separate function so that subclasses can 
+     * Do this in a separate function so that subclasses can
      *   choose to override it if they wish to deal differently
      *   with mouse events
-     * 
+     *
      *   Note in the following handler functions that some special
-     *    care is needed to deal correctly with mousing and popups. 
-     *   
+     *    care is needed to deal correctly with mousing and popups.
+     *
      *   Because the user might select the zoom-rectangle option and
      *    then drag it over a popup, we need a safe way to allow the
      *    mousemove and mouseup events to pass through the popup when
      *    they are initiated from outside.
-     * 
+     *
      *   Otherwise, we want to essentially kill the event propagation
-     *    for all other events, though we have to do so carefully, 
-     *    without disabling basic html functionality, like clicking on 
+     *    for all other events, though we have to do so carefully,
+     *    without disabling basic html functionality, like clicking on
      *    hyperlinks or drag-selecting text.
      */
      registerEvents:function() {
@@ -5453,31 +5453,31 @@
             "dblclick": this.ondblclick,
             scope: this
         });
-        
+
      },
 
-    /** 
-     * Method: onmousedown 
+    /**
+     * Method: onmousedown
      * When mouse goes down within the popup, make a note of
-     *   it locally, and then do not propagate the mousedown 
+     *   it locally, and then do not propagate the mousedown
      *   (but do so safely so that user can select text inside)
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmousedown: function (evt) {
         this.mousedown = true;
         OpenLayers.Event.stop(evt, true);
     },
 
-    /** 
+    /**
      * Method: onmousemove
-     * If the drag was started within the popup, then 
+     * If the drag was started within the popup, then
      *   do not propagate the mousemove (but do so safely
      *   so that user can select text inside)
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmousemove: function (evt) {
         if (this.mousedown) {
@@ -5485,15 +5485,15 @@
         }
     },
 
-    /** 
+    /**
      * Method: onmouseup
-     * When mouse comes up within the popup, after going down 
-     *   in it, reset the flag, and then (once again) do not 
-     *   propagate the event, but do so safely so that user can 
+     * When mouse comes up within the popup, after going down
+     *   in it, reset the flag, and then (once again) do not
+     *   propagate the event, but do so safely so that user can
      *   select text inside
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmouseup: function (evt) {
         if (this.mousedown) {
@@ -5505,32 +5505,32 @@
     /**
      * Method: onclick
      * Ignore clicks, but allowing default browser handling
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onclick: function (evt) {
         OpenLayers.Event.stop(evt, true);
     },
 
-    /** 
+    /**
      * Method: onmouseout
      * When mouse goes out of the popup set the flag to false so that
      *   if they let go and then drag back in, we won't be confused.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     onmouseout: function (evt) {
         this.mousedown = false;
     },
-    
-    /** 
+
+    /**
      * Method: ondblclick
      * Ignore double-clicks, but allowing default browser handling
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     ondblclick: function (evt) {
         OpenLayers.Event.stop(evt, true);
@@ -5558,13 +5558,13 @@
  *     one of the protocol subclasses instead.
  */
 OpenLayers.Protocol = OpenLayers.Class({
-    
+
     /**
      * Property: format
      * {<OpenLayers.Format>} The format used by this protocol.
      */
     format: null,
-    
+
     /**
      * Property: options
      * {Object} Any options sent to the constructor.
@@ -5578,7 +5578,7 @@
      *      true.
      */
     autoDestroy: true,
-   
+
     /**
      * Constructor: OpenLayers.Protocol
      * Abstract class for vector protocols.  Create instances of a subclass.
@@ -5601,7 +5601,7 @@
         this.options = null;
         this.format = null;
     },
-    
+
     /**
      * APIMethod: read
      * Construct a request for reading new features.
@@ -5616,8 +5616,8 @@
      */
     read: function() {
     },
-    
-    
+
+
     /**
      * APIMethod: create
      * Construct a request for writing newly created features.
@@ -5634,7 +5634,7 @@
      */
     create: function() {
     },
-    
+
     /**
      * APIMethod: update
      * Construct a request updating modified features.
@@ -5651,7 +5651,7 @@
      */
     update: function() {
     },
-    
+
     /**
      * APIMethod: delete
      * Construct a request deleting a removed feature.
@@ -5699,8 +5699,8 @@
      */
     abort: function(response) {
     },
-   
-    CLASS_NAME: "OpenLayers.Protocol" 
+
+    CLASS_NAME: "OpenLayers.Protocol"
 });
 
 /**
@@ -5784,37 +5784,37 @@
  * full text of the license. */
 
 /**
- * Class: OpenLayers.Renderer 
+ * Class: OpenLayers.Renderer
  * This is the base class for all renderers.
  *
  * This is based on a merger code written by Paul Spencer and Bertil Chapuis.
  * It is largely composed of virtual functions that are to be implemented
  * in technology-specific subclasses, but there is some generic code too.
- * 
+ *
  * The functions that *are* implemented here merely deal with the maintenance
- *  of the size and extent variables, as well as the cached 'resolution' 
- *  value. 
- * 
+ *  of the size and extent variables, as well as the cached 'resolution'
+ *  value.
+ *
  * A note to the user that all subclasses should use getResolution() instead
- *  of directly accessing this.resolution in order to correctly use the 
+ *  of directly accessing this.resolution in order to correctly use the
  *  cacheing system.
  *
  */
 OpenLayers.Renderer = OpenLayers.Class({
 
-    /** 
+    /**
      * Property: container
-     * {DOMElement} 
+     * {DOMElement}
      */
     container: null,
-    
+
     /**
      * Property: root
      * {DOMElement}
      */
     root: null,
 
-    /** 
+    /**
      * Property: extent
      * {<OpenLayers.Bounds>}
      */
@@ -5823,44 +5823,44 @@
     /**
      * Property: locked
      * {Boolean} If the renderer is currently in a state where many things
-     *     are changing, the 'locked' property is set to true. This means 
+     *     are changing, the 'locked' property is set to true. This means
      *     that renderers can expect at least one more drawFeature event to be
      *     called with the 'locked' property set to 'true': In some renderers,
      *     this might make sense to use as a 'only update local information'
-     *     flag. 
-     */  
+     *     flag.
+     */
     locked: false,
-    
-    /** 
+
+    /**
      * Property: size
-     * {<OpenLayers.Size>} 
+     * {<OpenLayers.Size>}
      */
     size: null,
-    
+
     /**
      * Property: resolution
      * {Float} cache of current map resolution
      */
     resolution: null,
-    
+
     /**
-     * Property: map  
+     * Property: map
      * {<OpenLayers.Map>} Reference to the map -- this is set in Vector's setMap()
      */
     map: null,
-    
+
     /**
-     * Constructor: OpenLayers.Renderer 
+     * Constructor: OpenLayers.Renderer
      *
      * Parameters:
-     * containerID - {<String>} 
+     * containerID - {<String>}
      * options - {Object} options for this renderer. See sublcasses for
      *     supported options.
      */
     initialize: function(containerID, options) {
         this.container = OpenLayers.Util.getElement(containerID);
     },
-    
+
     /**
      * APIMethod: destroy
      */
@@ -5875,20 +5875,20 @@
     /**
      * APIMethod: supported
      * This should be overridden by specific subclasses
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the renderer class
      */
     supported: function() {
         return false;
-    },    
-    
+    },
+
     /**
      * Method: setExtent
      * Set the visible part of the layer.
      *
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution) -- this way it will be re-computed when 
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution) -- this way it will be re-computed when
      * next it is needed.
      * We nullify the resolution cache (this.resolution) if resolutionChanged
      * is set to true - this way it will be re-computed on the next
@@ -5904,27 +5904,27 @@
             this.resolution = null;
         }
     },
-    
+
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
-     * 
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution) -- this way it will be re-computed when 
+     *
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution) -- this way it will be re-computed when
      * next it is needed.
      *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         this.size = size.clone();
         this.resolution = null;
     },
-    
-    /** 
+
+    /**
      * Method: getResolution
      * Uses cached copy of resolution if available to minimize computing
-     * 
+     *
      * Returns:
      * The current map's resolution
      */
@@ -5932,7 +5932,7 @@
         this.resolution = this.resolution || this.map.getResolution();
         return this.resolution;
     },
-    
+
     /**
      * Method: drawFeature
      * Draw the feature.  The optional style argument can be used
@@ -5940,9 +5940,9 @@
      * be called from layer.drawFeature().
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * feature - {<OpenLayers.Feature.Vector>}
      * style - {<Object>}
-     * 
+     *
      * Returns:
      * {Boolean} true if the feature has been drawn completely, false if not,
      *     undefined if the feature had no geometry
@@ -5969,26 +5969,26 @@
     },
 
 
-    /** 
+    /**
      * Method: drawGeometry
-     * 
+     *
      * Draw a geometry.  This should only be called from the renderer itself.
      * Use layer.drawFeature() from outside the renderer.
      * virtual function
      *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
-     * style - {Object} 
-     * featureId - {<String>} 
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     * featureId - {<String>}
      */
     drawGeometry: function(geometry, style, featureId) {},
-        
+
     /**
      * Method: drawText
      * Function for drawing text labels.
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
@@ -5999,40 +5999,40 @@
      * Method: removeText
      * Function for removing text labels.
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      */
     removeText: function(featureId) {},
-    
+
     /**
      * Method: clear
      * Clear all vectors from the renderer.
      * virtual function.
-     */    
+     */
     clear: function() {},
 
     /**
      * Method: getFeatureIdFromEvent
-     * Returns a feature id from an event on the renderer.  
+     * Returns a feature id from an event on the renderer.
      * How this happens is specific to the renderer.  This should be
      * called from layer.getFeatureFromEvent().
      * Virtual function.
-     * 
+     *
      * Parameters:
-     * evt - {<OpenLayers.Event>} 
+     * evt - {<OpenLayers.Event>}
      *
      * Returns:
      * {String} A feature id or null.
      */
     getFeatureIdFromEvent: function(evt) {},
-    
+
     /**
-     * Method: eraseFeatures 
+     * Method: eraseFeatures
      * This is called by the layer to erase features
-     * 
+     *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         if(!(features instanceof Array)) {
@@ -6043,23 +6043,23 @@
             this.removeText(features[i].id);
         }
     },
-    
+
     /**
      * Method: eraseGeometry
      * Remove a geometry from the renderer (by id).
      * virtual function.
-     * 
+     *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
+     * geometry - {<OpenLayers.Geometry>}
      */
     eraseGeometry: function(geometry) {},
-    
+
     /**
      * Method: moveRoot
      * moves this renderer's root to a (different) renderer.
      * To be implemented by subclasses that require a common renderer root for
      * feature selection.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      */
@@ -6070,7 +6070,7 @@
      * Gets the layer that this renderer's output appears on. If moveRoot was
      * used, this will be different from the id of the layer containing the
      * features rendered by this renderer.
-     * 
+     *
      * Returns:
      * {String} the id of the output layer.
      */
@@ -6094,21 +6094,21 @@
  *     one of the strategy subclasses instead.
  */
 OpenLayers.Strategy = OpenLayers.Class({
-    
+
     /**
      * Property: layer
      * {<OpenLayers.Layer.Vector>} The layer this strategy belongs to.
      */
     layer: null,
-    
+
     /**
      * Property: options
      * {Object} Any options sent to the constructor.
      */
     options: null,
 
-    /** 
-     * Property: active 
+    /**
+     * Property: active
      * {Boolean} The control is active.
      */
     active: null,
@@ -6143,7 +6143,7 @@
         // set the active property here, so that user cannot override it
         this.active = false;
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up the strategy.
@@ -6164,7 +6164,7 @@
     setLayer: function(layer) {
         this.layer = layer;
     },
-    
+
     /**
      * Method: activate
      * Activate the strategy.  Register any listeners, do appropriate setup.
@@ -6180,7 +6180,7 @@
         }
         return false;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivate the strategy.  Unregister any listeners, do appropriate
@@ -6197,8 +6197,8 @@
         }
         return false;
     },
-   
-    CLASS_NAME: "OpenLayers.Strategy" 
+
+    CLASS_NAME: "OpenLayers.Strategy"
 });
 /* ======================================================================
     OpenLayers/Control.js
@@ -6215,15 +6215,15 @@
 /**
  * Class: OpenLayers.Control
  * Controls affect the display or behavior of the map. They allow everything
- * from panning and zooming to displaying a scale indicator. Controls by 
+ * from panning and zooming to displaying a scale indicator. Controls by
  * default are added to the map they are contained within however it is
  * possible to add a control to an external div by passing the div in the
  * options parameter.
- * 
+ *
  * Example:
  * The following example shows how to add many of the common controls
  * to a map.
- * 
+ *
  * > var map = new OpenLayers.Map('map', { controls: [] });
  * >
  * > map.addControl(new OpenLayers.Control.PanZoomBar());
@@ -6235,10 +6235,10 @@
  * > map.addControl(new OpenLayers.Control.OverviewMap());
  * > map.addControl(new OpenLayers.Control.KeyboardDefaults());
  *
- * The next code fragment is a quick example of how to intercept 
+ * The next code fragment is a quick example of how to intercept
  * shift-mouse click to display the extent of the bounding box
  * dragged out by the user.  Usually controls are not created
- * in exactly this manner.  See the source for a more complete 
+ * in exactly this manner.  See the source for a more complete
  * example:
  *
  * > var control = new OpenLayers.Control();
@@ -6246,7 +6246,7 @@
  * >     draw: function () {
  * >         // this Handler.Box will intercept the shift-mousedown
  * >         // before Control.MouseDefault gets to see it
- * >         this.box = new OpenLayers.Handler.Box( control, 
+ * >         this.box = new OpenLayers.Handler.Box( control,
  * >             {"done": this.notice},
  * >             {keyMask: OpenLayers.Handler.MOD_SHIFT});
  * >         this.box.activate();
@@ -6255,70 +6255,70 @@
  * >     notice: function (bounds) {
  * >         OpenLayers.Console.userError(bounds);
  * >     }
- * > }); 
+ * > });
  * > map.addControl(control);
- * 
+ *
  */
 OpenLayers.Control = OpenLayers.Class({
 
-    /** 
-     * Property: id 
-     * {String} 
+    /**
+     * Property: id
+     * {String}
      */
     id: null,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} this gets set in the addControl() function in
-     * OpenLayers.Map 
+     * OpenLayers.Map
      */
     map: null,
 
-    /** 
-     * Property: div 
-     * {DOMElement} 
+    /**
+     * Property: div
+     * {DOMElement}
      */
     div: null,
 
-    /** 
-     * Property: type 
+    /**
+     * Property: type
      * {OpenLayers.Control.TYPES} Controls can have a 'type'. The type
      * determines the type of interactions which are possible with them when
-     * they are placed into a toolbar. 
+     * they are placed into a toolbar.
      */
-    type: null, 
+    type: null,
 
-    /** 
+    /**
      * Property: allowSelection
      * {Boolean} By deafault, controls do not allow selection, because
      * it may interfere with map dragging. If this is true, OpenLayers
      * will not prevent selection of the control.
      * Default is false.
      */
-    allowSelection: false,  
+    allowSelection: false,
 
-    /** 
-     * Property: displayClass 
+    /**
+     * Property: displayClass
      * {string}  This property is used for CSS related to the drawing of the
-     * Control. 
+     * Control.
      */
     displayClass: "",
-    
+
     /**
-    * Property: title  
-    * {string}  This property is used for showing a tooltip over the  
-    * Control.  
-    */ 
+    * Property: title
+    * {string}  This property is used for showing a tooltip over the
+    * Control.
+    */
     title: "",
 
-    /** 
-     * Property: active 
+    /**
+     * Property: active
      * {Boolean} The control is active.
      */
     active: null,
 
-    /** 
-     * Property: handler 
+    /**
+     * Property: handler
      * {<OpenLayers.Handler>} null
      */
     handler: null,
@@ -6332,7 +6332,7 @@
      */
     eventListeners: null,
 
-    /** 
+    /**
      * Property: events
      * {<OpenLayers.Events>} Events instance for triggering control specific
      *     events.
@@ -6366,22 +6366,22 @@
      * Constructor: OpenLayers.Control
      * Create an OpenLayers Control.  The options passed as a parameter
      * directly extend the control.  For example passing the following:
-     * 
+     *
      * > var control = new OpenLayers.Control({div: myDiv});
      *
      * Overrides the default div attribute value of null.
-     * 
+     *
      * Parameters:
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function (options) {
         // We do this before the extend so that instances can override
         // className in options.
-        this.displayClass = 
+        this.displayClass =
             this.CLASS_NAME.replace("OpenLayers.", "ol").replace(/\./g, "");
-        
+
         OpenLayers.Util.extend(this, options);
-        
+
         this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES);
         if(this.eventListeners instanceof Object) {
             this.events.on(this.eventListeners);
@@ -6427,14 +6427,14 @@
         }
     },
 
-    /** 
+    /**
      * Method: setMap
      * Set the map property for the control. This is done through an accessor
-     * so that subclasses can override this and take special action once 
-     * they have their map variable set. 
+     * so that subclasses can override this and take special action once
+     * they have their map variable set.
      *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         this.map = map;
@@ -6442,13 +6442,13 @@
             this.handler.setMap(map);
         }
     },
-  
+
     /**
      * Method: draw
      * The draw method is called when the control is ready to be displayed
      * on the page.  If a div has not been created one is created.  Controls
-     * with a visual component will almost always want to override this method 
-     * to customize the look of control. 
+     * with a visual component will almost always want to override this method
+     * to customize the look of control.
      *
      * Parameters:
      * px - {<OpenLayers.Pixel>} The top-left pixel position of the control
@@ -6464,8 +6464,8 @@
             if (!this.allowSelection) {
                 this.div.className += " olControlNoSelect";
                 this.div.setAttribute("unselectable", "on", 0);
-                this.div.onselectstart = function() { return(false); }; 
-            }    
+                this.div.onselectstart = function() { return(false); };
+            }
             if (this.title != "") {
                 this.div.title = this.title;
             }
@@ -6479,7 +6479,7 @@
 
     /**
      * Method: moveTo
-     * Sets the left and top style attributes to the passed in pixel 
+     * Sets the left and top style attributes to the passed in pixel
      * coordinates.
      *
      * Parameters:
@@ -6497,7 +6497,7 @@
      * Explicitly activates a control and it's associated
      * handler if one has been set.  Controls can be
      * deactivated by calling the deactivate() method.
-     * 
+     *
      * Returns:
      * {Boolean}  True if the control was successfully activated or
      *            false if the control was already active.
@@ -6519,12 +6519,12 @@
         this.events.triggerEvent("activate");
         return true;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivates a control and it's associated handler if any.  The exact
      * effect of this depends on the control itself.
-     * 
+     *
      * Returns:
      * {Boolean} True if the control was effectively deactivated or false
      *           if the control was already inactive.
@@ -6571,8 +6571,8 @@
  *     and methods to set and get the current language.
  */
 OpenLayers.Lang = {
-    
-    /** 
+
+    /**
      * Property: code
      * {String}  Current language code to use in OpenLayers.  Use the
      *     <setCode> method to set this value and the <getCode> method to
@@ -6580,13 +6580,13 @@
      */
     code: null,
 
-    /** 
+    /**
      * APIProperty: defaultCode
      * {String} Default language to use when a specific language can't be
      *     found.  Default is "en".
      */
     defaultCode: "en",
-        
+
     /**
      * APIFunction: getCode
      * Get the current language code.
@@ -6600,7 +6600,7 @@
         }
         return OpenLayers.Lang.code;
     },
-    
+
     /**
      * APIFunction: setCode
      * Set the language code for string translation.  This code is used by
@@ -6639,7 +6639,7 @@
             );
             lang = OpenLayers.Lang.defaultCode;
         }
-        
+
         OpenLayers.Lang.code = lang;
     },
 
@@ -6653,7 +6653,7 @@
      * key - {String} The key for an i18n string value in the dictionary.
      * context - {Object} Optional context to be used with
      *     <OpenLayers.String.format>.
-     * 
+     *
      * Returns:
      * {String} A internationalized string.
      */
@@ -6669,7 +6669,7 @@
         }
         return message;
     }
-    
+
 };
 
 
@@ -6684,7 +6684,7 @@
  * key - {String} The key for an i18n string value in the dictionary.
  * context - {Object} Optional context to be used with
  *     <OpenLayers.String.format>.
- * 
+ *
  * Returns:
  * {String} A internationalized string.
  */
@@ -6704,28 +6704,28 @@
 
 /**
  * Class: OpenLayers.Popup.Anchored
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Popup>
  */
-OpenLayers.Popup.Anchored = 
+OpenLayers.Popup.Anchored =
   OpenLayers.Class(OpenLayers.Popup, {
 
-    /** 
+    /**
      * Parameter: relativePosition
      * {String} Relative position of the popup ("br", "tr", "tl" or "bl").
      */
     relativePosition: null,
-    
+
     /**
-     * APIProperty: keepInMap 
-     * {Boolean} If panMapIfOutOfView is false, and this property is true, 
+     * APIProperty: keepInMap
+     * {Boolean} If panMapIfOutOfView is false, and this property is true,
      *     contrain the popup such that it always fits in the available map
      *     space. By default, this is set. If you are creating popups that are
      *     near map edges and not allowing pannning, and especially if you have
      *     a popup which has a fixedRelativePosition, setting this to false may
      *     be a smart thing to do.
-     *   
+     *
      *     For anchored popups, default is true, since subclasses will
      *     usually want this functionality.
      */
@@ -6733,20 +6733,20 @@
 
     /**
      * Parameter: anchor
-     * {Object} Object to which we'll anchor the popup. Must expose a 
+     * {Object} Object to which we'll anchor the popup. Must expose a
      *     'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>).
      */
     anchor: null,
 
-    /** 
+    /**
     * Constructor: OpenLayers.Popup.Anchored
-    * 
+    *
     * Parameters:
     * id - {String}
     * lonlat - {<OpenLayers.LonLat>}
     * contentSize - {<OpenLayers.Size>}
     * contentHTML - {String}
-    * anchor - {Object} Object which must expose a 'size' <OpenLayers.Size> 
+    * anchor - {Object} Object which must expose a 'size' <OpenLayers.Size>
     *     and 'offset' <OpenLayers.Pixel> (generally an <OpenLayers.Icon>).
     * closeBox - {Boolean}
     * closeBoxCallback - {Function} Function to be called on closeBox click.
@@ -6758,7 +6758,7 @@
         ];
         OpenLayers.Popup.prototype.initialize.apply(this, newArguments);
 
-        this.anchor = (anchor != null) ? anchor 
+        this.anchor = (anchor != null) ? anchor
                                        : { size: new OpenLayers.Size(0,0),
                                            offset: new OpenLayers.Pixel(0,0)};
     },
@@ -6769,13 +6769,13 @@
     destroy: function() {
         this.anchor = null;
         this.relativePosition = null;
-        
-        OpenLayers.Popup.prototype.destroy.apply(this, arguments);        
+
+        OpenLayers.Popup.prototype.destroy.apply(this, arguments);
     },
 
     /**
      * APIMethod: show
-     * Overridden from Popup since user might hide popup and then show() it 
+     * Overridden from Popup since user might hide popup and then show() it
      *     in a new location (meaning we might want to update the relative
      *     position on the show)
      */
@@ -6787,27 +6787,27 @@
     /**
      * Method: moveTo
      * Since the popup is moving to a new px, it might need also to be moved
-     *     relative to where the marker is. We first calculate the new 
-     *     relativePosition, and then we calculate the new px where we will 
-     *     put the popup, based on the new relative position. 
-     * 
-     *     If the relativePosition has changed, we must also call 
-     *     updateRelativePosition() to make any visual changes to the popup 
+     *     relative to where the marker is. We first calculate the new
+     *     relativePosition, and then we calculate the new px where we will
+     *     put the popup, based on the new relative position.
+     *
+     *     If the relativePosition has changed, we must also call
+     *     updateRelativePosition() to make any visual changes to the popup
      *     which are associated with putting it in a new relativePosition.
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      */
     moveTo: function(px) {
         var oldRelativePosition = this.relativePosition;
         this.relativePosition = this.calculateRelativePosition(px);
-        
+
         var newPx = this.calculateNewPx(px);
-        
-        var newArguments = new Array(newPx);        
+
+        var newArguments = new Array(newPx);
         OpenLayers.Popup.prototype.moveTo.apply(this, newArguments);
-        
-        //if this move has caused the popup to change its relative position, 
+
+        //if this move has caused the popup to change its relative position,
         // we need to make the appropriate cosmetic changes.
         if (this.relativePosition != oldRelativePosition) {
             this.updateRelativePosition();
@@ -6816,76 +6816,76 @@
 
     /**
      * APIMethod: setSize
-     * 
+     *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
+    setSize:function(contentSize) {
         OpenLayers.Popup.prototype.setSize.apply(this, arguments);
 
         if ((this.lonlat) && (this.map)) {
             var px = this.map.getLayerPxFromLonLat(this.lonlat);
             this.moveTo(px);
         }
-    },  
-    
-    /** 
+    },
+
+    /**
      * Method: calculateRelativePosition
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {String} The relative position ("br" "tr" "tl" "bl") at which the popup
      *     should be placed.
      */
     calculateRelativePosition:function(px) {
-        var lonlat = this.map.getLonLatFromLayerPx(px);        
-        
+        var lonlat = this.map.getLonLatFromLayerPx(px);
+
         var extent = this.map.getExtent();
         var quadrant = extent.determineQuadrant(lonlat);
-        
+
         return OpenLayers.Bounds.oppositeQuadrant(quadrant);
-    }, 
+    },
 
     /**
      * Method: updateRelativePosition
-     * The popup has been moved to a new relative location, so we may want to 
-     *     make some cosmetic adjustments to it. 
-     * 
-     *     Note that in the classic Anchored popup, there is nothing to do 
+     * The popup has been moved to a new relative location, so we may want to
+     *     make some cosmetic adjustments to it.
+     *
+     *     Note that in the classic Anchored popup, there is nothing to do
      *     here, since the popup looks exactly the same in all four positions.
-     *     Subclasses such as the AnchoredBubble and Framed, however, will 
+     *     Subclasses such as the AnchoredBubble and Framed, however, will
      *     want to do something special here.
      */
     updateRelativePosition: function() {
         //to be overridden by subclasses
     },
 
-    /** 
+    /**
      * Method: calculateNewPx
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The the new px position of the popup on the screen
      *     relative to the passed-in px.
      */
     calculateNewPx:function(px) {
         var newPx = px.offset(this.anchor.offset);
-        
+
         //use contentSize if size is not already set
         var size = this.size || this.contentSize;
 
         var top = (this.relativePosition.charAt(0) == 't');
         newPx.y += (top) ? -size.h : this.anchor.size.h;
-        
+
         var left = (this.relativePosition.charAt(1) == 'l');
         newPx.x += (left) ? -size.w : this.anchor.size.w;
 
-        return newPx;   
+        return newPx;
     },
 
     CLASS_NAME: "OpenLayers.Popup.Anchored"
@@ -6903,9 +6903,9 @@
  */
 
 /**
- * Class: OpenLayers.Renderer.Canvas 
+ * Class: OpenLayers.Renderer.Canvas
  * A renderer based on the 2D 'canvas' drawing element.element
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Renderer>
  */
@@ -6915,14 +6915,14 @@
      * Property: canvas
      * {Canvas} The canvas context object.
      */
-    canvas: null, 
-    
+    canvas: null,
+
     /**
      * Property: features
      * {Object} Internal object of feature/style pairs for use in redrawing the layer.
      */
-    features: null, 
-   
+    features: null,
+
     /**
      * Property: geometryMap
      * {Object} Geometry -> Feature lookup table. Used by eraseGeometry to
@@ -6930,12 +6930,12 @@
      *     when erasing geoms.
      */
     geometryMap: null,
- 
+
     /**
      * Constructor: OpenLayers.Renderer.Canvas
      *
      * Parameters:
-     * containerID - {<String>} 
+     * containerID - {<String>}
      */
     initialize: function(containerID) {
         OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
@@ -6945,13 +6945,13 @@
         this.features = {};
         this.geometryMap = {};
     },
-    
-    /** 
+
+    /**
      * Method: eraseGeometry
      * Erase a geometry from the renderer. Because the Canvas renderer has
      *     'memory' of the features that it has drawn, we have to remove the
-     *     feature so it doesn't redraw.   
-     * 
+     *     feature so it doesn't redraw.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      */
@@ -6961,31 +6961,31 @@
 
     /**
      * APIMethod: supported
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the renderer class
      */
     supported: function() {
         var canvas = document.createElement("canvas");
         return !!canvas.getContext;
-    },    
-    
+    },
+
     /**
      * Method: setExtent
      * Set the visible part of the layer.
      *
-     * Resolution has probably changed, so we nullify the resolution 
-     * cache (this.resolution), then redraw. 
+     * Resolution has probably changed, so we nullify the resolution
+     * cache (this.resolution), then redraw.
      *
      * Parameters:
-     * extent - {<OpenLayers.Bounds>} 
+     * extent - {<OpenLayers.Bounds>}
      */
     setExtent: function(extent) {
         this.extent = extent.clone();
         this.resolution = null;
         this.redraw();
     },
-    
+
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
@@ -6993,7 +6993,7 @@
      * Once the size is updated, redraw the canvas.
      *
      * Parameters:
-     * size - {<OpenLayers.Size>} 
+     * size - {<OpenLayers.Size>}
      */
     setSize: function(size) {
         this.size = size.clone();
@@ -7003,15 +7003,15 @@
         this.root.height = size.h;
         this.resolution = null;
     },
-    
+
     /**
      * Method: drawFeature
      * Draw the feature. Stores the feature in the features list,
-     * then redraws the layer. 
+     * then redraws the layer.
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
-     * style - {<Object>} 
+     * feature - {<OpenLayers.Feature.Vector>}
+     * style - {<Object>}
      */
     drawFeature: function(feature, style) {
         if(style == null) {
@@ -7023,23 +7023,23 @@
           'strokeWidth': 2,
           'fillOpacity': 1,
           'strokeOpacity': 1
-        }, style);  
-        this.features[feature.id] = [feature, style]; 
-        if (feature.geometry) { 
+        }, style);
+        this.features[feature.id] = [feature, style];
+        if (feature.geometry) {
             this.geometryMap[feature.geometry.id] = feature.id;
-        }    
+        }
         this.redraw();
     },
 
 
-    /** 
+    /**
      * Method: drawGeometry
      * Used when looping (in redraw) over the features; draws
-     * the canvas. 
+     * the canvas.
      *
      * Parameters:
-     * geometry - {<OpenLayers.Geometry>} 
-     * style - {Object} 
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
      */
     drawGeometry: function(geometry, style) {
         var className = geometry.CLASS_NAME;
@@ -7072,18 +7072,18 @@
 
     /**
      * Method: drawExternalGraphic
-     * Called to draw External graphics. 
-     * 
-     * Parameters: 
+     * Called to draw External graphics.
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawExternalGraphic: function(pt, style) {
        var img = new Image();
        img.src = style.externalGraphic;
-       
+
        if(style.graphicTitle) {
-           img.title=style.graphicTitle;           
+           img.title=style.graphicTitle;
        }
 
        var width = style.graphicWidth || style.graphicHeight;
@@ -7095,18 +7095,18 @@
        var yOffset = (style.graphicYOffset != undefined) ?
            style.graphicYOffset : -(0.5 * height);
        var opacity = style.graphicOpacity || style.fillOpacity;
-       
-       var context = { img: img, 
-                       x: (pt[0]+xOffset), 
-                       y: (pt[1]+yOffset), 
-                       width: width, 
-                       height: height, 
+
+       var context = { img: img,
+                       x: (pt[0]+xOffset),
+                       y: (pt[1]+yOffset),
+                       width: width,
+                       height: height,
                        canvas: this.canvas };
 
        img.onload = OpenLayers.Function.bind( function() {
-           this.canvas.drawImage(this.img, this.x, 
+           this.canvas.drawImage(this.img, this.x,
                                  this.y, this.width, this.height);
-       }, context);   
+       }, context);
     },
 
     /**
@@ -7118,10 +7118,10 @@
      * style - {Object} Symbolizer hash
      */
     setCanvasStyle: function(type, style) {
-        if (type == "fill") {     
+        if (type == "fill") {
             this.canvas.globalAlpha = style['fillOpacity'];
             this.canvas.fillStyle = style['fillColor'];
-        } else if (type == "stroke") {  
+        } else if (type == "stroke") {
             this.canvas.globalAlpha = style['strokeOpacity'];
             this.canvas.strokeStyle = style['strokeColor'];
             this.canvas.lineWidth = style['strokeWidth'];
@@ -7134,15 +7134,15 @@
     /**
      * Method: drawPoint
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawPoint: function(geometry, style) {
         if(style.graphic !== false) {
             var pt = this.getLocalXY(geometry);
-            
+
             if (style.externalGraphic) {
                 this.drawExternalGraphic(pt, style);
             } else {
@@ -7152,7 +7152,7 @@
                     this.canvas.arc(pt[0], pt[1], 6, 0, Math.PI*2, true);
                     this.canvas.fill();
                 }
-                
+
                 if(style.stroke !== false) {
                     this.setCanvasStyle("stroke", style);
                     this.canvas.beginPath();
@@ -7167,11 +7167,11 @@
     /**
      * Method: drawLineString
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawLineString: function(geometry, style) {
         if(style.stroke !== false) {
             this.setCanvasStyle("stroke", style);
@@ -7185,16 +7185,16 @@
             this.canvas.stroke();
         }
         this.setCanvasStyle("reset");
-    },    
-    
+    },
+
     /**
      * Method: drawLinearRing
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawLinearRing: function(geometry, style) {
         if(style.fill !== false) {
             this.setCanvasStyle("fill", style);
@@ -7207,9 +7207,9 @@
             }
             this.canvas.fill();
         }
-        
+
         if(style.stroke !== false) {
-            var oldWidth = this.canvas.lineWidth; 
+            var oldWidth = this.canvas.lineWidth;
             this.setCanvasStyle("stroke", style);
             this.canvas.beginPath();
             var start = this.getLocalXY(geometry.components[0]);
@@ -7221,29 +7221,29 @@
             this.canvas.stroke();
         }
         this.setCanvasStyle("reset");
-    },    
-    
+    },
+
     /**
      * Method: drawPolygon
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style    - {Object}
-     */ 
+     */
     drawPolygon: function(geometry, style) {
         this.drawLinearRing(geometry.components[0], style);
         for (var i = 1; i < geometry.components.length; i++) {
             this.drawLinearRing(geometry.components[i], {
-                fillOpacity: 0, 
-                strokeWidth: 0, 
-                strokeOpacity: 0, 
-                strokeColor: '#000000', 
+                fillOpacity: 0,
+                strokeWidth: 0,
+                strokeOpacity: 0,
+                strokeColor: '#000000',
                 fillColor: '#000000'}
-            ); // inner rings are 'empty'  
+            ); // inner rings are 'empty'
         }
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
@@ -7258,7 +7258,7 @@
             labelAlign: "cm"
         }, style);
         var pt = this.getLocalXY(location);
-        
+
         this.setCanvasStyle("reset");
         this.canvas.fillStyle = style.fontColor;
         this.canvas.globalAlpha = 1;
@@ -7287,7 +7287,7 @@
                     pt[0] -= len / 2;
             }
             this.canvas.translate(pt[0], pt[1]);
-            
+
             this.canvas.mozDrawText(style.label);
             this.canvas.translate(-1*pt[0], -1*pt[1]);
         }
@@ -7298,7 +7298,7 @@
      * Method: getLocalXY
      * transform geographic xy into pixel xy
      *
-     * Parameters: 
+     * Parameters:
      * point - {<OpenLayers.Geometry.Point>}
      */
     getLocalXY: function(point) {
@@ -7308,22 +7308,22 @@
         var y = ((extent.top / resolution) - point.y / resolution);
         return [x, y];
     },
-        
+
     /**
      * Method: clear
      * Clear all vectors from the renderer.
      * virtual function.
-     */    
+     */
     clear: function() {
         this.canvas.clearRect(0, 0, this.root.width, this.root.height);
     },
 
     /**
      * Method: getFeatureIdFromEvent
-     * Returns a feature id from an event on the renderer.  
-     * 
+     * Returns a feature id from an event on the renderer.
+     *
      * Parameters:
-     * evt - {<OpenLayers.Event>} 
+     * evt - {<OpenLayers.Event>}
      *
      * Returns:
      * {String} A feature id or null.
@@ -7331,9 +7331,9 @@
     getFeatureIdFromEvent: function(evt) {
         var loc = this.map.getLonLatFromPixel(evt.xy);
         var resolution = this.getResolution();
-        var bounds = new OpenLayers.Bounds(loc.lon - resolution * 5, 
-                                           loc.lat - resolution * 5, 
-                                           loc.lon + resolution * 5, 
+        var bounds = new OpenLayers.Bounds(loc.lon - resolution * 5,
+                                           loc.lat - resolution * 5,
+                                           loc.lon + resolution * 5,
                                            loc.lat + resolution * 5);
         var geom = bounds.toGeometry();
         for (var feat in this.features) {
@@ -7341,17 +7341,17 @@
             if (this.features[feat][0].geometry.intersects(geom)) {
                 return feat;
             }
-        }   
+        }
         return null;
     },
-    
+
     /**
-     * Method: eraseFeatures 
+     * Method: eraseFeatures
      * This is called by the layer to erase features; removes the feature from
      *     the list, then redraws the layer.
-     * 
+     *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         if(!(features instanceof Array)) {
@@ -7391,7 +7391,7 @@
                 item = labelMap[i];
                 this.drawText(item[0].geometry.getCentroid(), item[1]);
             }
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Renderer.Canvas"
@@ -7420,33 +7420,33 @@
 /**
  * Class: OpenLayers.ElementsIndexer
  * This class takes care of figuring out which order elements should be
- *     placed in the DOM based on given indexing methods. 
+ *     placed in the DOM based on given indexing methods.
  */
 OpenLayers.ElementsIndexer = OpenLayers.Class({
-   
+
     /**
      * Property: maxZIndex
      * {Integer} This is the largest-most z-index value for a node
      *     contained within the indexer.
      */
     maxZIndex: null,
-    
+
     /**
      * Property: order
      * {Array<String>} This is an array of node id's stored in the
      *     order that they should show up on screen. Id's higher up in the
      *     array (higher array index) represent nodes with higher z-indeces.
      */
-    order: null, 
-    
+    order: null,
+
     /**
      * Property: indices
      * {Object} This is a hash that maps node ids to their z-index value
-     *     stored in the indexer. This is done to make finding a nodes z-index 
+     *     stored in the indexer. This is done to make finding a nodes z-index
      *     value O(1).
      */
     indices: null,
-    
+
     /**
      * Property: compare
      * {Function} This is the function used to determine placement of
@@ -7454,34 +7454,34 @@
      *     the Z_ORDER_DRAWING_ORDER comparison method.
      */
     compare: null,
-    
+
     /**
      * APIMethod: initialize
-     * Create a new indexer with 
-     * 
+     * Create a new indexer with
+     *
      * Parameters:
      * yOrdering - {Boolean} Whether to use y-ordering.
      */
     initialize: function(yOrdering) {
 
-        this.compare = yOrdering ? 
+        this.compare = yOrdering ?
             OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER :
             OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;
-            
+
         this.order = [];
         this.indices = {};
         this.maxZIndex = 0;
     },
-    
+
     /**
      * APIMethod: insert
-     * Insert a new node into the indexer. In order to find the correct 
-     *     positioning for the node to be inserted, this method uses a binary 
-     *     search. This makes inserting O(log(n)). 
-     * 
+     * Insert a new node into the indexer. In order to find the correct
+     *     positioning for the node to be inserted, this method uses a binary
+     *     search. This makes inserting O(log(n)).
+     *
      * Parameters:
      * newNode - {DOMElement} The new node to be inserted.
-     * 
+     *
      * Returns
      * {DOMElement} the node before which we should insert our newNode, or
      *     null if newNode can just be appended.
@@ -7492,40 +7492,40 @@
         if (this.exists(newNode)) {
             this.remove(newNode);
         }
-        
+
         var nodeId = newNode.id;
-        
-        this.determineZIndex(newNode);       
 
+        this.determineZIndex(newNode);
+
         var leftIndex = -1;
         var rightIndex = this.order.length;
         var middle;
 
         while (rightIndex - leftIndex > 1) {
             middle = parseInt((leftIndex + rightIndex) / 2);
-            
+
             var placement = this.compare(this, newNode,
                 OpenLayers.Util.getElement(this.order[middle]));
-            
+
             if (placement > 0) {
                 leftIndex = middle;
             } else {
                 rightIndex = middle;
-            } 
+            }
         }
-        
+
         this.order.splice(rightIndex, 0, nodeId);
         this.indices[nodeId] = this.getZIndex(newNode);
-        
+
         // If the new node should be before another in the index
         // order, return the node before which we have to insert the new one;
         // else, return null to indicate that the new node can be appended.
-	return this.getNextElement(rightIndex);
+    return this.getNextElement(rightIndex);
     },
-    
+
     /**
      * APIMethod: remove
-     * 
+     *
      * Parameters:
      * node - {DOMElement} The node to be removed.
      */
@@ -7537,8 +7537,8 @@
             // from the indeces hash.
             this.order.splice(arrayIndex, 1);
             delete this.indices[nodeId];
-            
-            // Reset the maxium z-index based on the last item in the 
+
+            // Reset the maxium z-index based on the last item in the
             // order array.
             if (this.order.length > 0) {
                 var lastId = this.order[this.order.length - 1];
@@ -7548,7 +7548,7 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: clear
      */
@@ -7557,7 +7557,7 @@
         this.indices = {};
         this.maxZIndex = 0;
     },
-    
+
     /**
      * APIMethod: exists
      *
@@ -7574,29 +7574,29 @@
     /**
      * APIMethod: getZIndex
      * Get the z-index value for the current node from the node data itself.
-     * 
+     *
      * Parameters:
      * node - {DOMElement} The node whose z-index to get.
-     * 
+     *
      * Returns:
-     * {Integer} The z-index value for the specified node (from the node 
+     * {Integer} The z-index value for the specified node (from the node
      *     data itself).
      */
     getZIndex: function(node) {
-        return node._style.graphicZIndex;  
+        return node._style.graphicZIndex;
     },
-    
+
     /**
      * Method: determineZIndex
-     * Determine the z-index for the current node if there isn't one, 
+     * Determine the z-index for the current node if there isn't one,
      *     and set the maximum value if we've found a new maximum.
-     * 
+     *
      * Parameters:
-     * node - {DOMElement} 
+     * node - {DOMElement}
      */
     determineZIndex: function(node) {
         var zIndex = node._style.graphicZIndex;
-        
+
         // Everything must have a zIndex. If none is specified,
         // this means the user *must* (hint: assumption) want this
         // node to succomb to drawing order. To enforce drawing order
@@ -7604,59 +7604,59 @@
         // greater than any currently in the indexer.
         if (zIndex == null) {
             zIndex = this.maxZIndex;
-            node._style.graphicZIndex = zIndex; 
+            node._style.graphicZIndex = zIndex;
         } else if (zIndex > this.maxZIndex) {
             this.maxZIndex = zIndex;
         }
     },
-	
+
     /**
      * APIMethod: getNextElement
      * Get the next element in the order stack.
-     * 
+     *
      * Parameters:
      * index - {Integer} The index of the current node in this.order.
-     * 
+     *
      * Returns:
      * {DOMElement} the node following the index passed in, or
      *     null.
      */
     getNextElement: function(index) {
-		var nextIndex = index + 1;
+        var nextIndex = index + 1;
         if (nextIndex < this.order.length){
-			var nextElement = OpenLayers.Util.getElement(this.order[nextIndex]);
-			if (nextElement == undefined){
-			  nextElement = this.getNextElement(nextIndex);
-			}
-			return nextElement;
-		} else {
-			return null;
-		} 
-    },	
-    
+            var nextElement = OpenLayers.Util.getElement(this.order[nextIndex]);
+            if (nextElement == undefined){
+              nextElement = this.getNextElement(nextIndex);
+            }
+            return nextElement;
+        } else {
+            return null;
+        }
+    },
+
     CLASS_NAME: "OpenLayers.ElementsIndexer"
 });
 
 /**
  * Namespace: OpenLayers.ElementsIndexer.IndexingMethods
- * These are the compare methods for figuring out where a new node should be 
- *     placed within the indexer. These methods are very similar to general 
- *     sorting methods in that they return -1, 0, and 1 to specify the 
+ * These are the compare methods for figuring out where a new node should be
+ *     placed within the indexer. These methods are very similar to general
+ *     sorting methods in that they return -1, 0, and 1 to specify the
  *     direction in which new nodes fall in the ordering.
  */
 OpenLayers.ElementsIndexer.IndexingMethods = {
-    
+
     /**
      * Method: Z_ORDER
      * This compare method is used by other comparison methods.
      *     It can be used individually for ordering, but is not recommended,
      *     because it doesn't subscribe to drawing order.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
@@ -7666,93 +7666,93 @@
         var returnVal = 0;
         if (nextNode) {
             var nextZIndex = indexer.getZIndex(nextNode);
-            returnVal = newZIndex - nextZIndex; 
+            returnVal = newZIndex - nextZIndex;
         }
-        
+
         return returnVal;
     },
 
     /**
      * APIMethod: Z_ORDER_DRAWING_ORDER
      * This method orders nodes by their z-index, but does so in a way
-     *     that, if there are other nodes with the same z-index, the newest 
-     *     drawn will be the front most within that z-index. This is the 
+     *     that, if there are other nodes with the same z-index, the newest
+     *     drawn will be the front most within that z-index. This is the
      *     default indexing method.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
     Z_ORDER_DRAWING_ORDER: function(indexer, newNode, nextNode) {
         var returnVal = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(
-            indexer, 
-            newNode, 
+            indexer,
+            newNode,
             nextNode
         );
-        
+
         // Make Z_ORDER subscribe to drawing order by pushing it above
         // all of the other nodes with the same z-index.
         if (nextNode && returnVal == 0) {
             returnVal = 1;
         }
-        
+
         return returnVal;
     },
 
     /**
      * APIMethod: Z_ORDER_Y_ORDER
      * This one should really be called Z_ORDER_Y_ORDER_DRAWING_ORDER, as it
-     *     best describes which ordering methods have precedence (though, the 
-     *     name would be too long). This method orders nodes by their z-index, 
-     *     but does so in a way that, if there are other nodes with the same 
-     *     z-index, the nodes with the lower y position will be "closer" than 
-     *     those with a higher y position. If two nodes have the exact same y 
-     *     position, however, then this method will revert to using drawing  
+     *     best describes which ordering methods have precedence (though, the
+     *     name would be too long). This method orders nodes by their z-index,
+     *     but does so in a way that, if there are other nodes with the same
+     *     z-index, the nodes with the lower y position will be "closer" than
+     *     those with a higher y position. If two nodes have the exact same y
+     *     position, however, then this method will revert to using drawing
      *     order to decide placement.
-     * 
+     *
      * Parameters:
      * indexer - {<OpenLayers.ElementsIndexer>}
      * newNode - {DOMElement}
      * nextNode - {DOMElement}
-     * 
+     *
      * Returns:
      * {Integer}
      */
     Z_ORDER_Y_ORDER: function(indexer, newNode, nextNode) {
         var returnVal = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(
-            indexer, 
-            newNode, 
+            indexer,
+            newNode,
             nextNode
         );
-        
+
         if (nextNode && returnVal == 0) {
             var newLat = newNode._geometry.getBounds().bottom;
             var nextLat = nextNode._geometry.getBounds().bottom;
-            
+
             var result = nextLat - newLat;
             returnVal = (result ==0) ? 1 : result;
         }
-        
-        return returnVal;       
+
+        return returnVal;
     }
 };
 
 /**
  * Class: OpenLayers.Renderer.Elements
- * This is another virtual class in that it should never be instantiated by 
- *  itself as a Renderer. It exists because there is *tons* of shared 
+ * This is another virtual class in that it should never be instantiated by
+ *  itself as a Renderer. It exists because there is *tons* of shared
  *  functionality between different vector libraries which use nodes/elements
- *  as a base for rendering vectors. 
- * 
- * The highlevel bits of code that are implemented here are the adding and 
- *  removing of geometries, which is essentially the same for any 
+ *  as a base for rendering vectors.
+ *
+ * The highlevel bits of code that are implemented here are the adding and
+ *  removing of geometries, which is essentially the same for any
  *  element-based renderer. The details of creating each node and drawing the
- *  paths are of course different, but the machinery is the same. 
- * 
+ *  paths are of course different, but the machinery is the same.
+ *
  * Inherits:
  *  - <OpenLayers.Renderer>
  */
@@ -7763,13 +7763,13 @@
      * {DOMElement}
      */
     rendererRoot: null,
-    
+
     /**
      * Property: root
      * {DOMElement}
      */
     root: null,
-    
+
     /**
      * Property: vectorRoot
      * {DOMElement}
@@ -7785,29 +7785,29 @@
     /**
      * Property: xmlns
      * {String}
-     */    
+     */
     xmlns: null,
-    
+
     /**
      * Property: Indexer
-     * {<OpenLayers.ElementIndexer>} An instance of OpenLayers.ElementsIndexer 
+     * {<OpenLayers.ElementIndexer>} An instance of OpenLayers.ElementsIndexer
      *     created upon initialization if the zIndexing or yOrdering options
      *     passed to this renderer's constructor are set to true.
      */
-    indexer: null, 
-    
+    indexer: null,
+
     /**
      * Constant: BACKGROUND_ID_SUFFIX
      * {String}
      */
     BACKGROUND_ID_SUFFIX: "_background",
-    
+
     /**
      * Constant: BACKGROUND_ID_SUFFIX
      * {String}
      */
     LABEL_ID_SUFFIX: "_label",
-    
+
     /**
      * Property: minimumSymbolizer
      * {Object}
@@ -7819,10 +7819,10 @@
         fillOpacity: 1,
         pointRadius: 0
     },
-    
+
     /**
      * Constructor: OpenLayers.Renderer.Elements
-     * 
+     *
      * Parameters:
      * containerID - {String}
      * options - {Object} options for this renderer. Supported options are:
@@ -7837,24 +7837,24 @@
         this.root = this.createRoot("_root");
         this.vectorRoot = this.createRoot("_vroot");
         this.textRoot = this.createRoot("_troot");
-        
+
         this.root.appendChild(this.vectorRoot);
         this.root.appendChild(this.textRoot);
-        
+
         this.rendererRoot.appendChild(this.root);
         this.container.appendChild(this.rendererRoot);
-        
+
         if(options && (options.zIndexing || options.yOrdering)) {
             this.indexer = new OpenLayers.ElementsIndexer(options.yOrdering);
         }
     },
-    
+
     /**
      * Method: destroy
      */
     destroy: function() {
 
-        this.clear(); 
+        this.clear();
 
         this.rendererRoot = null;
         this.root = null;
@@ -7862,11 +7862,11 @@
 
         OpenLayers.Renderer.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: clear
      * Remove all the elements from the root
-     */    
+     */
     clear: function() {
         if (this.vectorRoot) {
             while (this.vectorRoot.childNodes.length > 0) {
@@ -7883,26 +7883,26 @@
         }
     },
 
-    /** 
+    /**
      * Method: getNodeType
      * This function is in charge of asking the specific renderer which type
      *     of node to create for the given geometry and style. All geometries
      *     in an Elements-based renderer consist of one node and some
      *     attributes. We have the nodeFactory() function which creates a node
      *     for us, but it takes a 'type' as input, and that is precisely what
-     *     this function tells us.  
-     *  
+     *     this function tells us.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} The corresponding node type for the specified geometry
      */
     getNodeType: function(geometry, style) { },
 
-    /** 
-     * Method: drawGeometry 
+    /**
+     * Method: drawGeometry
      * Draw the geometry, creating new nodes, setting paths, setting style,
      *     setting featureId on the node.  This method should only be called
      *     by the renderer itself.
@@ -7911,7 +7911,7 @@
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the geometry has been drawn completely; null if
      *     incomplete; false otherwise
@@ -7951,16 +7951,16 @@
         }
         return rendered;
     },
-    
+
     /**
      * Method: redrawNode
-     * 
+     *
      * Parameters:
      * id - {String}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the complete geometry could be drawn, null if parts of
      *     the geometry could not be drawn, false otherwise
@@ -7968,7 +7968,7 @@
     redrawNode: function(id, geometry, style, featureId) {
         // Get the node if it's already on the map.
         var node = this.nodeFactory(id, this.getNodeType(geometry, style));
-        
+
         // Set the data for the node, then draw it.
         node._featureId = featureId;
         node._geometry = geometry;
@@ -7979,9 +7979,9 @@
         if(drawResult === false) {
             return false;
         }
-         
+
         node = drawResult.node;
-        
+
         // Insert the node into the indexer so it can show us where to
         // place it. Note that this operation is O(log(n)). If there's a
         // performance problem (when dragging, for instance) this is
@@ -7996,39 +7996,39 @@
         } else {
             // if there's no indexer, simply append the node to root,
             // but only if the node is a new one
-            if (node.parentNode !== this.vectorRoot){ 
+            if (node.parentNode !== this.vectorRoot){
                 this.vectorRoot.appendChild(node);
             }
         }
-        
+
         this.postDraw(node);
-        
+
         return drawResult.complete;
     },
-    
+
     /**
      * Method: redrawBackgroundNode
      * Redraws the node using special 'background' style properties. Basically
-     *     just calls redrawNode(), but instead of directly using the 
-     *     'externalGraphic', 'graphicXOffset', 'graphicYOffset', and 
-     *     'graphicZIndex' properties directly from the specified 'style' 
-     *     parameter, we create a new style object and set those properties 
-     *     from the corresponding 'background'-prefixed properties from 
+     *     just calls redrawNode(), but instead of directly using the
+     *     'externalGraphic', 'graphicXOffset', 'graphicYOffset', and
+     *     'graphicZIndex' properties directly from the specified 'style'
+     *     parameter, we create a new style object and set those properties
+     *     from the corresponding 'background'-prefixed properties from
      *     specified 'style' parameter.
-     * 
+     *
      * Parameters:
      * id - {String}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
      * featureId - {String}
-     * 
+     *
      * Returns:
      * {Boolean} true if the complete geometry could be drawn, null if parts of
      *     the geometry could not be drawn, false otherwise
      */
     redrawBackgroundNode: function(id, geometry, style, featureId) {
         var backgroundStyle = OpenLayers.Util.extend({}, style);
-        
+
         // Set regular style attributes to apply to the background styles.
         backgroundStyle.externalGraphic = backgroundStyle.backgroundGraphic;
         backgroundStyle.graphicXOffset = backgroundStyle.backgroundXOffset;
@@ -8036,17 +8036,17 @@
         backgroundStyle.graphicZIndex = backgroundStyle.backgroundGraphicZIndex;
         backgroundStyle.graphicWidth = backgroundStyle.backgroundWidth || backgroundStyle.graphicWidth;
         backgroundStyle.graphicHeight = backgroundStyle.backgroundHeight || backgroundStyle.graphicHeight;
-        
+
         // Erase background styles.
         backgroundStyle.backgroundGraphic = null;
         backgroundStyle.backgroundXOffset = null;
         backgroundStyle.backgroundYOffset = null;
         backgroundStyle.backgroundGraphicZIndex = null;
-        
+
         return this.redrawNode(
-            id + this.BACKGROUND_ID_SUFFIX, 
-            geometry, 
-            backgroundStyle, 
+            id + this.BACKGROUND_ID_SUFFIX,
+            geometry,
+            backgroundStyle,
             null
         );
     },
@@ -8061,7 +8061,7 @@
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {Object} a hash with properties "node" (the drawn node) and "complete"
      *     (null if parts of the geometry could not be drawn, false if nothing
@@ -8108,8 +8108,8 @@
                 break;
         }
 
-        node._style = style; 
-        node._options = options; 
+        node._style = style;
+        node._options = options;
 
         //set style
         //TBD simplify this
@@ -8122,129 +8122,129 @@
             return false;
         }
     },
-    
+
     /**
      * Method: postDraw
      * Things that have do be done after the geometry node is appended
      *     to its parent node. To be overridden by subclasses.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      */
     postDraw: function(node) {},
-    
+
     /**
      * Method: drawPoint
-     * Virtual function for drawing Point Geometry. 
+     * Virtual function for drawing Point Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the point
-     */ 
+     */
     drawPoint: function(node, geometry) {},
 
     /**
      * Method: drawLineString
-     * Virtual function for drawing LineString Geometry. 
+     * Virtual function for drawing LineString Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components of
      *     the linestring, or false if nothing could be drawn
-     */ 
+     */
     drawLineString: function(node, geometry) {},
 
     /**
      * Method: drawLinearRing
-     * Virtual function for drawing LinearRing Geometry. 
+     * Virtual function for drawing LinearRing Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the linear ring, or false if nothing could be drawn
-     */ 
+     */
     drawLinearRing: function(node, geometry) {},
 
     /**
      * Method: drawPolygon
-     * Virtual function for drawing Polygon Geometry. 
+     * Virtual function for drawing Polygon Geometry.
      *    Should be implemented by subclasses.
      *    This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the polygon, or false if nothing could be drawn
-     */ 
+     */
     drawPolygon: function(node, geometry) {},
 
     /**
      * Method: drawRectangle
-     * Virtual function for drawing Rectangle Geometry. 
+     * Virtual function for drawing Rectangle Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the rectangle
-     */ 
+     */
     drawRectangle: function(node, geometry) {},
 
     /**
      * Method: drawCircle
-     * Virtual function for drawing Circle Geometry. 
+     * Virtual function for drawing Circle Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the circle
-     */ 
+     */
     drawCircle: function(node, geometry) {},
 
     /**
      * Method: drawSurface
-     * Virtual function for drawing Surface Geometry. 
+     * Virtual function for drawing Surface Geometry.
      *     Should be implemented by subclasses.
      *     This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the surface
-     */ 
+     */
     drawSurface: function(node, geometry) {},
 
     /**
      * Method: removeText
      * Removes a label
-     * 
+     *
      * Parameters:
      * featureId - {String}
      */
@@ -8257,12 +8257,12 @@
 
     /**
      * Method: getFeatureIdFromEvent
-     * 
+     *
      * Parameters:
      * evt - {Object} An <OpenLayers.Event> object
      *
      * Returns:
-     * {<OpenLayers.Geometry>} A geometry from an event that 
+     * {<OpenLayers.Geometry>} A geometry from an event that
      *     happened on a layer.
      */
     getFeatureIdFromEvent: function(evt) {
@@ -8273,13 +8273,13 @@
         return featureId;
     },
 
-    /** 
+    /**
      * Method: eraseGeometry
-     * Erase a geometry from the renderer. In the case of a multi-geometry, 
-     *     we cycle through and recurse on ourselves. Otherwise, we look for a 
+     * Erase a geometry from the renderer. In the case of a multi-geometry,
+     *     we cycle through and recurse on ourselves. Otherwise, we look for a
      *     node with the geometry.id, destroy its geometry, and remove it from
      *     the DOM.
-     * 
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      */
@@ -8291,7 +8291,7 @@
             for (var i=0, len=geometry.components.length; i<len; i++) {
                 this.eraseGeometry(geometry.components[i]);
             }
-        } else {    
+        } else {
             var element = OpenLayers.Util.getElement(geometry.id);
             if (element && element.parentNode) {
                 if (element.geometry) {
@@ -8303,7 +8303,7 @@
                 if (this.indexer) {
                     this.indexer.remove(element);
                 }
-                
+
                 if (element._style.backgroundGraphic) {
                     var backgroundId = geometry.id + this.BACKGROUND_ID_SUFFIX;
                     var bElem = OpenLayers.Util.getElement(backgroundId);
@@ -8317,17 +8317,17 @@
         }
     },
 
-    /** 
+    /**
      * Method: nodeFactory
      * Create new node of the specified type, with the (optional) specified id.
-     * 
+     *
      * If node already exists with same ID and a different type, we remove it
      *     and then call ourselves again to recreate it.
-     * 
+     *
      * Parameters:
      * id - {String}
      * type - {String} type Kind of node to draw.
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id.
      */
@@ -8343,27 +8343,27 @@
         }
         return node;
     },
-    
-    /** 
+
+    /**
      * Method: nodeTypeCompare
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * type - {String} Kind of node
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the specified node is of the specified type
      *     This function must be overridden by subclasses.
      */
     nodeTypeCompare: function(node, type) {},
-    
-    /** 
+
+    /**
      * Method: createNode
-     * 
+     *
      * Parameters:
      * type - {String} Kind of node to draw.
      * id - {String} Id for node.
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id.
      *     This function must be overridden by subclasses.
@@ -8373,7 +8373,7 @@
     /**
      * Method: moveRoot
      * moves this renderer's root to a different renderer.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      */
@@ -8385,27 +8385,27 @@
         root.parentNode.removeChild(root);
         renderer.rendererRoot.appendChild(root);
     },
-    
+
     /**
      * Method: getRenderLayerId
      * Gets the layer that this renderer's output appears on. If moveRoot was
      * used, this will be different from the id of the layer containing the
      * features rendered by this renderer.
-     * 
+     *
      * Returns:
      * {String} the id of the output layer.
      */
     getRenderLayerId: function() {
         return this.root.parentNode.parentNode.id;
     },
-    
+
     /**
      * Method: isComplexSymbol
      * Determines if a symbol cannot be rendered using drawCircle
-     * 
+     *
      * Parameters:
      * graphicName - {String}
-     * 
+     *
      * Returns
      * {Boolean} true if the symbol is complex, false if not
      */
@@ -8450,7 +8450,7 @@
  *  - <OpenLayers.Strategy>
  */
 OpenLayers.Strategy.Fixed = OpenLayers.Class(OpenLayers.Strategy, {
-    
+
     /**
      * APIProperty: preload
      * {Boolean} Load data before layer made visible. Enabling this may result
@@ -8505,11 +8505,11 @@
         }
         return false;
     },
-    
+
     /**
      * Method: deactivate
      * Deactivate the strategy.  Undo what is done in <activate>.
-     * 
+     *
      * Returns:
      * {Boolean} The strategy was successfully deactivated.
      */
@@ -8586,38 +8586,38 @@
  * Namespace: OpenLayers.Tween
  */
 OpenLayers.Tween = OpenLayers.Class({
-    
+
     /**
      * Constant: INTERVAL
      * {int} Interval in milliseconds between 2 steps
      */
     INTERVAL: 10,
-    
+
     /**
      * APIProperty: easing
      * {<OpenLayers.Easing>(Function)} Easing equation used for the animation
      *     Defaultly set to OpenLayers.Easing.Expo.easeOut
      */
     easing: null,
-    
+
     /**
      * APIProperty: begin
      * {Object} Values to start the animation with
      */
     begin: null,
-    
+
     /**
      * APIProperty: finish
      * {Object} Values to finish the animation with
      */
     finish: null,
-    
+
     /**
      * APIProperty: duration
      * {int} duration of the tween (number of steps)
      */
     duration: null,
-    
+
     /**
      * APIProperty: callbacks
      * {Object} An object with start, eachStep and done properties whose values
@@ -8625,40 +8625,40 @@
      *     current computed value as argument.
      */
     callbacks: null,
-    
+
     /**
      * Property: time
      * {int} Step counter
      */
     time: null,
-    
+
     /**
      * Property: interval
      * {int} Interval id returned by window.setInterval
      */
     interval: null,
-    
+
     /**
      * Property: playing
      * {Boolean} Tells if the easing is currently playing
      */
     playing: false,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Tween
      * Creates a Tween.
      *
      * Parameters:
      * easing - {<OpenLayers.Easing>(Function)} easing function method to use
-     */ 
+     */
     initialize: function(easing) {
         this.easing = (easing) ? easing : OpenLayers.Easing.Expo.easeOut;
     },
-    
+
     /**
      * APIMethod: start
      * Plays the Tween, and calls the callback method on each step
-     * 
+     *
      * Parameters:
      * begin - {Object} values to start the animation with
      * finish - {Object} values to finish the animation with
@@ -8682,7 +8682,7 @@
         this.interval = window.setInterval(
             OpenLayers.Function.bind(this.play, this), this.INTERVAL);
     },
-    
+
     /**
      * APIMethod: stop
      * Stops the Tween, and calls the done callback
@@ -8692,7 +8692,7 @@
         if (!this.playing) {
             return;
         }
-        
+
         if (this.callbacks && this.callbacks.done) {
             this.callbacks.done.call(this, this.finish);
         }
@@ -8700,7 +8700,7 @@
         this.interval = null;
         this.playing = false;
     },
-    
+
     /**
      * Method: play
      * Calls the appropriate easing method
@@ -8713,16 +8713,16 @@
             if (b == null || f == null || isNaN(b) || isNaN(f)) {
                 OpenLayers.Console.error('invalid value for Tween');
             }
-            
+
             var c = f - b;
             value[i] = this.easing.apply(this, [this.time, b, c, this.duration]);
         }
         this.time++;
-        
+
         if (this.callbacks && this.callbacks.eachStep) {
             this.callbacks.eachStep.call(this, value);
         }
-        
+
         if (this.time > this.duration) {
             if (this.callbacks && this.callbacks.done) {
                 this.callbacks.done.call(this, this.finish);
@@ -8732,7 +8732,7 @@
             this.interval = null;
         }
     },
-    
+
     /**
      * Create empty functions for all easing methods.
      */
@@ -8741,7 +8741,7 @@
 
 /**
  * Namespace: OpenLayers.Easing
- * 
+ *
  * Credits:
  *      Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>
  */
@@ -8756,10 +8756,10 @@
  * Namespace: OpenLayers.Easing.Linear
  */
 OpenLayers.Easing.Linear = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8769,10 +8769,10 @@
     easeIn: function(t, b, c, d) {
         return c*t/d + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8782,10 +8782,10 @@
     easeOut: function(t, b, c, d) {
         return c*t/d + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8803,10 +8803,10 @@
  * Namespace: OpenLayers.Easing.Expo
  */
 OpenLayers.Easing.Expo = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8816,10 +8816,10 @@
     easeIn: function(t, b, c, d) {
         return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8829,10 +8829,10 @@
     easeOut: function(t, b, c, d) {
         return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8853,10 +8853,10 @@
  * Namespace: OpenLayers.Easing.Quad
  */
 OpenLayers.Easing.Quad = {
-    
+
     /**
      * Function: easeIn
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8866,10 +8866,10 @@
     easeIn: function(t, b, c, d) {
         return c*(t/=d)*t + b;
     },
-    
+
     /**
      * Function: easeOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8879,10 +8879,10 @@
     easeOut: function(t, b, c, d) {
         return -c *(t/=d)*(t-2) + b;
     },
-    
+
     /**
      * Function: easeInOut
-     * 
+     *
      * Parameters:
      * t - {Float} time
      * b - {Float} beginning position
@@ -8911,11 +8911,11 @@
 
 /**
  * Class: OpenLayers.Control.ArgParser
- * The ArgParser control adds location bar querystring parsing functionality 
+ * The ArgParser control adds location bar querystring parsing functionality
  * to an OpenLayers Map.
- * When added to a Map control, on a page load/refresh, the Map will 
- * automatically take the href string and parse it for lon, lat, zoom, and 
- * layers information. 
+ * When added to a Map control, on a page load/refresh, the Map will
+ * automatically take the href string and parse it for lon, lat, zoom, and
+ * layers information.
  *
  * Inherits from:
  *  - <OpenLayers.Control>
@@ -8927,7 +8927,7 @@
      * {<OpenLayers.LonLat>}
      */
     center: null,
-    
+
     /**
      * Parameter: zoom
      * {int}
@@ -8935,14 +8935,14 @@
     zoom: null,
 
     /**
-     * Parameter: layers 
+     * Parameter: layers
      * {Array(<OpenLayers.Layer>)}
      */
     layers: null,
-    
-    /** 
+
+    /**
      * APIProperty: displayProjection
-     * {<OpenLayers.Projection>} Requires proj4js support. 
+     * {<OpenLayers.Projection>} Requires proj4js support.
      *     Projection used when reading the coordinates from the URL. This will
      *
      *     reproject the map coordinates from the URL into the map's
@@ -8951,9 +8951,9 @@
      *     If you are using this functionality, be aware that any permalink
      *     which is added to the map will determine the coordinate type which
      *     is read from the URL, which means you should not add permalinks with
-     *     different displayProjections to the same map. 
+     *     different displayProjections to the same map.
      */
-    displayProjection: null, 
+    displayProjection: null,
 
     /**
      * Constructor: OpenLayers.Control.ArgParser
@@ -8967,10 +8967,10 @@
 
     /**
      * Method: setMap
-     * Set the map property for the control. 
-     * 
+     * Set the map property for the control.
+     *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         OpenLayers.Control.prototype.setMap.apply(this, arguments);
@@ -8980,14 +8980,14 @@
             var control = this.map.controls[i];
             if ( (control != this) &&
                  (control.CLASS_NAME == "OpenLayers.Control.ArgParser") ) {
-                
-                // If a second argparser is added to the map, then we 
+
+                // If a second argparser is added to the map, then we
                 // override the displayProjection to be the one added to the
-                // map. 
+                // map.
                 if (control.displayProjection != this.displayProjection) {
                     this.displayProjection = control.displayProjection;
-                }    
-                
+                }
+
                 break;
             }
         }
@@ -8997,9 +8997,9 @@
             // Be careful to set layer first, to not trigger unnecessary layer loads
             if (args.layers) {
                 this.layers = args.layers;
-    
-                // when we add a new layer, set its visibility 
-                this.map.events.register('addlayer', this, 
+
+                // when we add a new layer, set its visibility
+                this.map.events.register('addlayer', this,
                                          this.configureLayers);
                 this.configureLayers();
             }
@@ -9009,51 +9009,51 @@
                 if (args.zoom) {
                     this.zoom = parseInt(args.zoom);
                 }
-    
+
                 // when we add a new baselayer to see when we can set the center
-                this.map.events.register('changebaselayer', this, 
+                this.map.events.register('changebaselayer', this,
                                          this.setCenter);
                 this.setCenter();
             }
         }
     },
-   
-    /** 
+
+    /**
      * Method: setCenter
      * As soon as a baseLayer has been loaded, we center and zoom
      *   ...and remove the handler.
      */
     setCenter: function() {
-        
+
         if (this.map.baseLayer) {
             //dont need to listen for this one anymore
-            this.map.events.unregister('changebaselayer', this, 
+            this.map.events.unregister('changebaselayer', this,
                                        this.setCenter);
-            
+
             if (this.displayProjection) {
-                this.center.transform(this.displayProjection, 
-                                      this.map.getProjectionObject()); 
-            }      
+                this.center.transform(this.displayProjection,
+                                      this.map.getProjectionObject());
+            }
 
             this.map.setCenter(this.center, this.zoom);
         }
     },
 
-    /** 
+    /**
      * Method: configureLayers
-     * As soon as all the layers are loaded, cycle through them and 
-     *   hide or show them. 
+     * As soon as all the layers are loaded, cycle through them and
+     *   hide or show them.
      */
     configureLayers: function() {
 
-        if (this.layers.length == this.map.layers.length) { 
+        if (this.layers.length == this.map.layers.length) {
             this.map.events.unregister('addlayer', this, this.configureLayers);
 
             for(var i=0, len=this.layers.length; i<len; i++) {
-                
+
                 var layer = this.map.layers[i];
                 var c = this.layers.charAt(i);
-                
+
                 if (c == "B") {
                     this.map.setBaseLayer(layer);
                 } else if ( (c == "T") || (c == "F") ) {
@@ -9061,7 +9061,7 @@
                 }
             }
         }
-    },     
+    },
 
     CLASS_NAME: "OpenLayers.Control.ArgParser"
 });
@@ -9089,38 +9089,38 @@
  */
 OpenLayers.Control.PanZoom = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * APIProperty: slideFactor
-     * {Integer} Number of pixels by which we'll pan the map in any direction 
+     * {Integer} Number of pixels by which we'll pan the map in any direction
      *     on clicking the arrow buttons.  If you want to pan by some ratio
      *     of the map dimensions, use <slideRatio> instead.
      */
     slideFactor: 50,
 
-    /** 
+    /**
      * APIProperty: slideRatio
-     * {Number} The fraction of map width/height by which we'll pan the map            
+     * {Number} The fraction of map width/height by which we'll pan the map
      *     on clicking the arrow buttons.  Default is null.  If set, will
      *     override <slideFactor>. E.g. if slideRatio is .5, then the Pan Up
-     *     button will pan up half the map height. 
+     *     button will pan up half the map height.
      */
     slideRatio: null,
 
-    /** 
+    /**
      * Property: buttons
-     * {Array(DOMElement)} Array of Button Divs 
+     * {Array(DOMElement)} Array of Button Divs
      */
     buttons: null,
 
-    /** 
+    /**
      * Property: position
-     * {<OpenLayers.Pixel>} 
+     * {<OpenLayers.Pixel>}
      */
     position: null,
 
     /**
      * Constructor: OpenLayers.Control.PanZoom
-     * 
+     *
      * Parameters:
      * options - {Object}
      */
@@ -9144,8 +9144,8 @@
      * Method: draw
      *
      * Parameters:
-     * px - {<OpenLayers.Pixel>} 
-     * 
+     * px - {<OpenLayers.Pixel>}
+     *
      * Returns:
      * {DOMElement} A reference to the container div for the PanZoom control.
      */
@@ -9164,26 +9164,26 @@
         px.y = centered.y+sz.h;
         this._addButton("panleft", "west-mini.png", px, sz);
         this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz);
-        this._addButton("pandown", "south-mini.png", 
+        this._addButton("pandown", "south-mini.png",
                         centered.add(0, sz.h*2), sz);
-        this._addButton("zoomin", "zoom-plus-mini.png", 
+        this._addButton("zoomin", "zoom-plus-mini.png",
                         centered.add(0, sz.h*3+5), sz);
-        this._addButton("zoomworld", "zoom-world-mini.png", 
+        this._addButton("zoomworld", "zoom-world-mini.png",
                         centered.add(0, sz.h*4+5), sz);
-        this._addButton("zoomout", "zoom-minus-mini.png", 
+        this._addButton("zoomout", "zoom-minus-mini.png",
                         centered.add(0, sz.h*5+5), sz);
         return this.div;
     },
-    
+
     /**
      * Method: _addButton
-     * 
+     *
      * Parameters:
-     * id - {String} 
-     * img - {String} 
-     * xy - {<OpenLayers.Pixel>} 
-     * sz - {<OpenLayers.Size>} 
-     * 
+     * id - {String}
+     * img - {String}
+     * xy - {<OpenLayers.Pixel>}
+     * sz - {<OpenLayers.Size>}
+     *
      * Returns:
      * {DOMElement} A Div (an alphaImageDiv, to be precise) that contains the
      *     image of the button, and has all the proper event handlers set.
@@ -9191,21 +9191,21 @@
     _addButton:function(id, img, xy, sz) {
         var imgLocation = OpenLayers.Util.getImagesLocation() + img;
         var btn = OpenLayers.Util.createAlphaImageDiv(
-                                    this.id + "_" + id, 
+                                    this.id + "_" + id,
                                     xy, sz, imgLocation, "absolute");
 
         //we want to add the outer div
         this.div.appendChild(btn);
 
-        OpenLayers.Event.observe(btn, "mousedown", 
+        OpenLayers.Event.observe(btn, "mousedown",
             OpenLayers.Function.bindAsEventListener(this.buttonDown, btn));
-        OpenLayers.Event.observe(btn, "dblclick", 
+        OpenLayers.Event.observe(btn, "dblclick",
             OpenLayers.Function.bindAsEventListener(this.doubleClick, btn));
-        OpenLayers.Event.observe(btn, "click", 
+        OpenLayers.Event.observe(btn, "click",
             OpenLayers.Function.bindAsEventListener(this.doubleClick, btn));
         btn.action = id;
         btn.map = this.map;
-    
+
         if(!this.slideRatio){
             var slideFactorPixels = this.slideFactor;
             var getSlideFactor = function() {
@@ -9224,10 +9224,10 @@
         this.buttons.push(btn);
         return btn;
     },
-    
+
     /**
      * Method: _removeButton
-     * 
+     *
      * Parameters:
      * btn - {Object}
      */
@@ -9237,7 +9237,7 @@
         this.div.removeChild(btn);
         OpenLayers.Util.removeItem(this.buttons, btn);
     },
-    
+
     /**
      * Method: removeButtons
      */
@@ -9246,12 +9246,12 @@
             this._removeButton(this.buttons[i]);
         }
     },
-    
+
     /**
      * Method: doubleClick
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -9260,12 +9260,12 @@
         OpenLayers.Event.stop(evt);
         return false;
     },
-    
+
     /**
      * Method: buttonDown
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     buttonDown: function (evt) {
         if (!OpenLayers.Event.isLeftClick(evt)) {
@@ -9273,26 +9273,26 @@
         }
 
         switch (this.action) {
-            case "panup": 
+            case "panup":
                 this.map.pan(0, -this.getSlideFactor("h"));
                 break;
-            case "pandown": 
+            case "pandown":
                 this.map.pan(0, this.getSlideFactor("h"));
                 break;
-            case "panleft": 
+            case "panleft":
                 this.map.pan(-this.getSlideFactor("w"), 0);
                 break;
-            case "panright": 
+            case "panright":
                 this.map.pan(this.getSlideFactor("w"), 0);
                 break;
-            case "zoomin": 
-                this.map.zoomIn(); 
+            case "zoomin":
+                this.map.zoomIn();
                 break;
-            case "zoomout": 
-                this.map.zoomOut(); 
+            case "zoomout":
+                this.map.zoomOut();
                 break;
-            case "zoomworld": 
-                this.map.zoomToMaxExtent(); 
+            case "zoomworld":
+                this.map.zoomToMaxExtent();
                 break;
         }
 
@@ -9318,7 +9318,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2007 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 /**
@@ -9327,13 +9327,13 @@
 
 /**
  * Class: OpenLayers.Control.ScaleLine
- * The ScaleLine displays a small line indicator representing the current 
+ * The ScaleLine displays a small line indicator representing the current
  * map scale on the map. By default it is drawn in the lower left corner of
  * the map.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Control>
- *  
+ *
  * Is a very close copy of:
  *  - <OpenLayers.Control.Scale>
  */
@@ -9350,7 +9350,7 @@
      * {String} Units for zoomed out on top bar.  Default is km.
      */
     topOutUnits: "km",
-    
+
     /**
      * Property: topInUnits
      * {String} Units for zoomed in on top bar.  Default is m.
@@ -9368,7 +9368,7 @@
      * {String} Units for zoomed in on bottom bar.  Default is ft.
      */
     bottomInUnits: "ft",
-    
+
     /**
      * Property: eTop
      * {DOMElement}
@@ -9384,18 +9384,18 @@
     /**
      * Constructor: OpenLayers.Control.ScaleLine
      * Create a new scale line control.
-     * 
+     *
      * Parameters:
      * options - {Object} An optional object whose properties will be used
      *     to extend the control.
      */
     initialize: function(options) {
-        OpenLayers.Control.prototype.initialize.apply(this, [options]);     
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
     },
 
     /**
      * Method: draw
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -9404,7 +9404,7 @@
         if (!this.eTop) {
             this.div.style.display = "block";
             this.div.style.position = "absolute";
-            
+
             // stick in the top bar
             this.eTop = document.createElement("div");
             this.eTop.className = this.displayClass + "Top";
@@ -9431,14 +9431,14 @@
         return this.div;
     },
 
-    /** 
+    /**
      * Method: getBarLen
      * Given a number, round it down to the nearest 1,2,5 times a power of 10.
      * That seems a fairly useful set of number groups to use.
-     * 
+     *
      * Parameters:
      * maxLen - {float}  the number we're rounding down from
-     * 
+     *
      * Returns:
      * {Float} the rounded number (less than or equal to maxLen)
      */
@@ -9446,7 +9446,7 @@
         // nearest power of 10 lower than maxLen
         var digits = parseInt(Math.log(maxLen) / Math.log(10));
         var pow10 = Math.pow(10, digits);
-        
+
         // ok, find first character
         var firstChar = parseInt(maxLen / pow10);
 
@@ -9478,9 +9478,9 @@
         var inches = OpenLayers.INCHES_PER_UNIT;
 
         // convert maxWidth to map units
-        var maxSizeData = this.maxWidth * res * inches[curMapUnits];  
+        var maxSizeData = this.maxWidth * res * inches[curMapUnits];
 
-        // decide whether to use large or small scale units     
+        // decide whether to use large or small scale units
         var topUnits;
         var bottomUnits;
         if(maxSizeData > 100000) {
@@ -9506,22 +9506,22 @@
         // and to pixel units
         var topPx = topMax / res;
         var bottomPx = bottomMax / res;
-        
+
         // now set the pixel widths
         // and the values inside them
-        
+
         if (this.eBottom.style.visibility == "visible"){
-            this.eBottom.style.width = Math.round(bottomPx) + "px"; 
+            this.eBottom.style.width = Math.round(bottomPx) + "px";
             this.eBottom.innerHTML = bottomRounded + " " + bottomUnits ;
         }
-            
+
         if (this.eTop.style.visibility == "visible"){
             this.eTop.style.width = Math.round(topPx) + "px";
             this.eTop.innerHTML = topRounded + " " + topUnits;
         }
-        
-    }, 
 
+    },
+
     CLASS_NAME: "OpenLayers.Control.ScaleLine"
 });
 
@@ -9544,64 +9544,64 @@
  */
 OpenLayers.Event = {
 
-    /** 
-     * Property: observers 
+    /**
+     * Property: observers
      * {Object} A hashtable cache of the event observers. Keyed by
-     * element._eventCacheID 
+     * element._eventCacheID
      */
     observers: false,
-    
-    /** 
-     * Constant: KEY_BACKSPACE 
-     * {int} 
+
+    /**
+     * Constant: KEY_BACKSPACE
+     * {int}
      */
     KEY_BACKSPACE: 8,
 
-    /** 
-     * Constant: KEY_TAB 
-     * {int} 
+    /**
+     * Constant: KEY_TAB
+     * {int}
      */
     KEY_TAB: 9,
 
-    /** 
-     * Constant: KEY_RETURN 
-     * {int} 
+    /**
+     * Constant: KEY_RETURN
+     * {int}
      */
     KEY_RETURN: 13,
 
-    /** 
-     * Constant: KEY_ESC 
-     * {int} 
+    /**
+     * Constant: KEY_ESC
+     * {int}
      */
     KEY_ESC: 27,
 
-    /** 
-     * Constant: KEY_LEFT 
-     * {int} 
+    /**
+     * Constant: KEY_LEFT
+     * {int}
      */
     KEY_LEFT: 37,
 
-    /** 
-     * Constant: KEY_UP 
-     * {int} 
+    /**
+     * Constant: KEY_UP
+     * {int}
      */
     KEY_UP: 38,
 
-    /** 
-     * Constant: KEY_RIGHT 
-     * {int} 
+    /**
+     * Constant: KEY_RIGHT
+     * {int}
      */
     KEY_RIGHT: 39,
 
-    /** 
-     * Constant: KEY_DOWN 
-     * {int} 
+    /**
+     * Constant: KEY_DOWN
+     * {int}
      */
     KEY_DOWN: 40,
 
-    /** 
-     * Constant: KEY_DELETE 
-     * {int} 
+    /**
+     * Constant: KEY_DELETE
+     * {int}
      */
     KEY_DELETE: 46,
 
@@ -9609,12 +9609,12 @@
     /**
      * Method: element
      * Cross browser event element detection.
-     * 
+     *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
-     * {DOMElement} The element that caused the event 
+     * {DOMElement} The element that caused the event
      */
     element: function(event) {
         return event.target || event.srcElement;
@@ -9622,11 +9622,11 @@
 
     /**
      * Method: isLeftClick
-     * Determine whether event was caused by a left click. 
+     * Determine whether event was caused by a left click.
      *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
      * {Boolean}
      */
@@ -9637,11 +9637,11 @@
 
     /**
      * Method: isRightClick
-     * Determine whether event was caused by a right mouse click. 
+     * Determine whether event was caused by a right mouse click.
      *
      * Parameters:
-     * event - {Event} 
-     * 
+     * event - {Event}
+     *
      * Returns:
      * {Boolean}
      */
@@ -9649,29 +9649,29 @@
         return (((event.which) && (event.which == 3)) ||
                 ((event.button) && (event.button == 2)));
     },
-     
+
     /**
      * Method: stop
-     * Stops an event from propagating. 
+     * Stops an event from propagating.
      *
-     * Parameters: 
-     * event - {Event} 
-     * allowDefault - {Boolean} If true, we stop the event chain but 
-     *                               still allow the default browser 
-     *                               behaviour (text selection, radio-button 
+     * Parameters:
+     * event - {Event}
+     * allowDefault - {Boolean} If true, we stop the event chain but
+     *                               still allow the default browser
+     *                               behaviour (text selection, radio-button
      *                               clicking, etc)
      *                               Default false
      */
     stop: function(event, allowDefault) {
-        
-        if (!allowDefault) { 
+
+        if (!allowDefault) {
             if (event.preventDefault) {
                 event.preventDefault();
             } else {
                 event.returnValue = false;
             }
         }
-                
+
         if (event.stopPropagation) {
             event.stopPropagation();
         } else {
@@ -9679,13 +9679,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: findElement
-     * 
+     *
      * Parameters:
-     * event - {Event} 
-     * tagName - {String} 
-     * 
+     * event - {Event}
+     * tagName - {String}
+     *
      * Returns:
      * {DOMElement} The first node with the given tagName, starting from the
      * node the event was triggered on and traversing the DOM upwards
@@ -9699,14 +9699,14 @@
         return element;
     },
 
-    /** 
+    /**
      * Method: observe
-     * 
+     *
      * Parameters:
-     * elementParam - {DOMElement || String} 
-     * name - {String} 
-     * observer - {function} 
-     * useCapture - {Boolean} 
+     * elementParam - {DOMElement || String}
+     * name - {String}
+     * observer - {function}
+     * useCapture - {Boolean}
      */
     observe: function(elementParam, name, observer, useCapture) {
         var element = OpenLayers.Util.getElement(elementParam);
@@ -9755,14 +9755,14 @@
         }
     },
 
-    /** 
+    /**
      * Method: stopObservingElement
-     * Given the id of an element to stop observing, cycle through the 
-     *   element's cached observers, calling stopObserving on each one, 
+     * Given the id of an element to stop observing, cycle through the
+     *   element's cached observers, calling stopObserving on each one,
      *   skipping those entries which can no longer be removed.
-     * 
+     *
      * parameters:
-     * elementParam - {DOMElement || String} 
+     * elementParam - {DOMElement || String}
      */
     stopObservingElement: function(elementParam) {
         var element = OpenLayers.Util.getElement(elementParam);
@@ -9775,8 +9775,8 @@
      * Method: _removeElementObservers
      *
      * Parameters:
-     * elementObservers - {Array(Object)} Array of (element, name, 
-     *                                         observer, usecapture) objects, 
+     * elementObservers - {Array(Object)} Array of (element, name,
+     *                                         observer, usecapture) objects,
      *                                         taken directly from hashtable
      */
     _removeElementObservers: function(elementObservers) {
@@ -9794,24 +9794,24 @@
 
     /**
      * Method: stopObserving
-     * 
+     *
      * Parameters:
-     * elementParam - {DOMElement || String} 
-     * name - {String} 
-     * observer - {function} 
-     * useCapture - {Boolean} 
-     *  
+     * elementParam - {DOMElement || String}
+     * name - {String}
+     * observer - {function}
+     * useCapture - {Boolean}
+     *
      * Returns:
      * {Boolean} Whether or not the event observer was removed
      */
     stopObserving: function(elementParam, name, observer, useCapture) {
         useCapture = useCapture || false;
-    
+
         var element = OpenLayers.Util.getElement(elementParam);
         var cacheID = element._eventCacheID;
 
         if (name == 'keypress') {
-            if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) || 
+            if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
                  element.detachEvent) {
               name = 'keydown';
             }
@@ -9821,27 +9821,27 @@
         var foundEntry = false;
         var elementObservers = OpenLayers.Event.observers[cacheID];
         if (elementObservers) {
-    
+
             // find the specific event type in the element's list
             var i=0;
             while(!foundEntry && i < elementObservers.length) {
                 var cacheEntry = elementObservers[i];
-    
+
                 if ((cacheEntry.name == name) &&
                     (cacheEntry.observer == observer) &&
                     (cacheEntry.useCapture == useCapture)) {
-    
+
                     elementObservers.splice(i, 1);
                     if (elementObservers.length == 0) {
                         delete OpenLayers.Event.observers[cacheID];
                     }
                     foundEntry = true;
-                    break; 
+                    break;
                 }
-                i++;           
+                i++;
             }
         }
-    
+
         //actually remove the event listener from browser
         if (foundEntry) {
             if (element.removeEventListener) {
@@ -9852,11 +9852,11 @@
         }
         return foundEntry;
     },
-    
-    /** 
+
+    /**
      * Method: unloadCache
      * Cycle through all the element entries in the events cache and call
-     *   stopObservingElement on each. 
+     *   stopObservingElement on each.
      */
     unloadCache: function() {
         // check for OpenLayers.Event before checking for observers, because
@@ -9865,7 +9865,7 @@
         if (OpenLayers.Event && OpenLayers.Event.observers) {
             for (var cacheID in OpenLayers.Event.observers) {
                 var elementObservers = OpenLayers.Event.observers[cacheID];
-                OpenLayers.Event._removeElementObservers.apply(this, 
+                OpenLayers.Event._removeElementObservers.apply(this,
                                                            [elementObservers]);
             }
             OpenLayers.Event.observers = false;
@@ -9891,65 +9891,65 @@
  */
 OpenLayers.Events = OpenLayers.Class({
 
-    /** 
+    /**
      * Constant: BROWSER_EVENTS
-     * {Array(String)} supported events 
+     * {Array(String)} supported events
      */
     BROWSER_EVENTS: [
         "mouseover", "mouseout",
-        "mousedown", "mouseup", "mousemove", 
+        "mousedown", "mouseup", "mousemove",
         "click", "dblclick", "rightclick", "dblrightclick",
         "resize", "focus", "blur"
     ],
 
-    /** 
-     * Property: listeners 
-     * {Object} Hashtable of Array(Function): events listener functions  
+    /**
+     * Property: listeners
+     * {Object} Hashtable of Array(Function): events listener functions
      */
     listeners: null,
 
-    /** 
-     * Property: object 
-     * {Object}  the code object issuing application events 
+    /**
+     * Property: object
+     * {Object}  the code object issuing application events
      */
     object: null,
 
-    /** 
-     * Property: element 
-     * {DOMElement}  the DOM element receiving browser events 
+    /**
+     * Property: element
+     * {DOMElement}  the DOM element receiving browser events
      */
     element: null,
 
-    /** 
-     * Property: eventTypes 
-     * {Array(String)}  list of support application events 
+    /**
+     * Property: eventTypes
+     * {Array(String)}  list of support application events
      */
     eventTypes: null,
 
-    /** 
-     * Property: eventHandler 
-     * {Function}  bound event handler attached to elements 
+    /**
+     * Property: eventHandler
+     * {Function}  bound event handler attached to elements
      */
     eventHandler: null,
 
-    /** 
-     * APIProperty: fallThrough 
-     * {Boolean} 
+    /**
+     * APIProperty: fallThrough
+     * {Boolean}
      */
     fallThrough: null,
 
-    /** 
+    /**
      * APIProperty: includeXY
      * {Boolean} Should the .xy property automatically be created for browser
      *    mouse events? In general, this should be false. If it is true, then
-     *    mouse events will automatically generate a '.xy' property on the 
+     *    mouse events will automatically generate a '.xy' property on the
      *    event object that is passed. (Prior to OpenLayers 2.7, this was true
      *    by default.) Otherwise, you can call the getMousePosition on the
      *    relevant events handler on the object available via the 'evt.object'
      *    property of the evt object. So, for most events, you can call:
-     *    function named(evt) { 
-     *        this.xy = this.object.events.getMousePosition(evt) 
-     *    } 
+     *    function named(evt) {
+     *        this.xy = this.object.events.getMousePosition(evt)
+     *    }
      *
      *    This option typically defaults to false for performance reasons:
      *    when creating an events object whose primary purpose is to manage
@@ -9959,12 +9959,12 @@
      *    This option is also used to control whether the events object caches
      *    offsets. If this is false, it will not: the reason for this is that
      *    it is only expected to be called many times if the includeXY property
-     *    is set to true. If you set this to true, you are expected to clear 
+     *    is set to true. If you set this to true, you are expected to clear
      *    the offset cache manually (using this.clearMouseCache()) if:
      *        the border of the element changes
      *        the location of the element in the page changes
     */
-    includeXY: false,      
+    includeXY: false,
 
     /**
      * Method: clearMouseListener
@@ -9981,7 +9981,7 @@
      * Parameters:
      * object - {Object} The js object to which this Events object  is being
      * added element - {DOMElement} A dom element to respond to browser events
-     * eventTypes - {Array(String)} Array of custom application events 
+     * eventTypes - {Array(String)} Array of custom application events
      * fallThrough - {Boolean} Allow events to fall through after these have
      *                         been handled?
      * options - {Object} Options for the events object.
@@ -9997,13 +9997,13 @@
         this.eventHandler = OpenLayers.Function.bindAsEventListener(
             this.handleBrowserEvent, this
         );
-        
+
         // to be used with observe and stopObserving
         this.clearMouseListener = OpenLayers.Function.bind(
             this.clearMouseCache, this
         );
 
-        // if eventTypes is specified, create a listeners list for each 
+        // if eventTypes is specified, create a listeners list for each
         // custom application event.
         this.eventTypes = [];
         if (eventTypes != null) {
@@ -10011,8 +10011,8 @@
                 this.addEventType(eventTypes[i]);
             }
         }
-        
-        // if a dom element is specified, add a listeners list 
+
+        // if a dom element is specified, add a listeners list
         // for browser events on the element and register them
         if (element != null) {
             this.attachToElement(element);
@@ -10044,7 +10044,7 @@
      * APIMethod: addEventType
      * Add a new event type to this events object.
      * If the event type has already been added, do nothing.
-     * 
+     *
      * Parameters:
      * eventName - {String}
      */
@@ -10069,17 +10069,17 @@
         for (var i=0, len=this.BROWSER_EVENTS.length; i<len; i++) {
             var eventType = this.BROWSER_EVENTS[i];
 
-            // every browser event has a corresponding application event 
+            // every browser event has a corresponding application event
             // (whether it's listened for or not).
             this.addEventType(eventType);
-            
+
             // use Prototype to register the event cross-browser
             OpenLayers.Event.observe(element, eventType, this.eventHandler);
         }
         // disable dragstart in IE so that mousedown/move/up works normally
         OpenLayers.Event.observe(element, "dragstart", OpenLayers.Event.stop);
     },
-    
+
     /**
      * Method: on
      * Convenience method for registering listeners with a common scope.
@@ -10106,31 +10106,31 @@
      * Register an event on the events object.
      *
      * When the event is triggered, the 'func' function will be called, in the
-     * context of 'obj'. Imagine we were to register an event, specifying an 
-     * OpenLayers.Bounds Object as 'obj'. When the event is triggered, the 
+     * context of 'obj'. Imagine we were to register an event, specifying an
+     * OpenLayers.Bounds Object as 'obj'. When the event is triggered, the
      * context in the callback function will be our Bounds object. This means
-     * that within our callback function, we can access the properties and 
-     * methods of the Bounds object through the "this" variable. So our 
-     * callback could execute something like: 
+     * that within our callback function, we can access the properties and
+     * methods of the Bounds object through the "this" variable. So our
+     * callback could execute something like:
      * :    leftStr = "Left: " + this.left;
-     *   
+     *
      *                   or
-     *  
+     *
      * :    centerStr = "Center: " + this.getCenterLonLat();
      *
      * Parameters:
      * type - {String} Name of the event to register
      * obj - {Object} The object to bind the context to for the callback#.
-     *                     If no object is specified, default is the Events's 
+     *                     If no object is specified, default is the Events's
      *                     'object' property.
-     * func - {Function} The callback function. If no callback is 
+     * func - {Function} The callback function. If no callback is
      *                        specified, this function does nothing.
-     * 
-     * 
+     *
+     *
      */
     register: function (type, obj, func) {
 
-        if ( (func != null) && 
+        if ( (func != null) &&
              (OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) {
 
             if (obj == null)  {
@@ -10145,17 +10145,17 @@
      * APIMethod: registerPriority
      * Same as register() but adds the new listener to the *front* of the
      *     events queue instead of to the end.
-     *    
-     *     TODO: get rid of this in 3.0 - Decide whether listeners should be 
+     *
+     *     TODO: get rid of this in 3.0 - Decide whether listeners should be
      *     called in the order they were registered or in reverse order.
      *
      *
      * Parameters:
      * type - {String} Name of the event to register
      * obj - {Object} The object to bind the context to for the callback#.
-     *                If no object is specified, default is the Events's 
+     *                If no object is specified, default is the Events's
      *                'object' property.
-     * func - {Function} The callback function. If no callback is 
+     * func - {Function} The callback function. If no callback is
      *                   specified, this function does nothing.
      */
     registerPriority: function (type, obj, func) {
@@ -10170,7 +10170,7 @@
             }
         }
     },
-    
+
     /**
      * Method: un
      * Convenience method for unregistering listeners with a common scope.
@@ -10196,9 +10196,9 @@
      * APIMethod: unregister
      *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      * obj - {Object} If none specified, defaults to this.object
-     * func - {Function} 
+     * func - {Function}
      */
     unregister: function (type, obj, func) {
         if (obj == null)  {
@@ -10215,13 +10215,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: remove
      * Remove all listeners for a given event type. If type is not registered,
      *     does nothing.
      *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      */
     remove: function(type) {
         if (this.listeners[type] != null) {
@@ -10231,10 +10231,10 @@
 
     /**
      * APIMethod: triggerEvent
-     * Trigger a specified registered event.  
-     * 
+     * Trigger a specified registered event.
+     *
      * Parameters:
-     * type - {String} 
+     * type - {String}
      * evt - {Event}
      *
      * Returns:
@@ -10258,7 +10258,7 @@
         if(!evt.type) {
             evt.type = type;
         }
-    
+
         // execute all callbacks registered for specified type
         // get a clone of the listeners array to
         // allow for splicing during callbacks
@@ -10274,7 +10274,7 @@
             }
         }
         // don't fall through to other DOM elements
-        if (!this.fallThrough) {           
+        if (!this.fallThrough) {
             OpenLayers.Event.stop(evt, true);
         }
         return continueChain;
@@ -10282,38 +10282,38 @@
 
     /**
      * Method: handleBrowserEvent
-     * Basically just a wrapper to the triggerEvent() function, but takes 
-     *     care to set a property 'xy' on the event with the current mouse 
+     * Basically just a wrapper to the triggerEvent() function, but takes
+     *     care to set a property 'xy' on the event with the current mouse
      *     position.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     handleBrowserEvent: function (evt) {
         if (this.includeXY) {
             evt.xy = this.getMousePosition(evt);
-        } 
+        }
         this.triggerEvent(evt.type, evt);
     },
 
     /**
      * APIMethod: clearMouseCache
-     * Clear cached data about the mouse position. This should be called any 
-     *     time the element that events are registered on changes position 
+     * Clear cached data about the mouse position. This should be called any
+     *     time the element that events are registered on changes position
      *     within the page.
      */
-    clearMouseCache: function() { 
+    clearMouseCache: function() {
         this.element.scrolls = null;
         this.element.lefttop = null;
         this.element.offsets = null;
-    },      
+    },
 
     /**
      * Method: getMousePosition
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
-     * 
+     * evt - {Event}
+     *
      * Returns:
      * {<OpenLayers.Pixel>} The current xy coordinate of the mouse, adjusted
      *                      for offsets
@@ -10325,7 +10325,7 @@
             OpenLayers.Event.observe(window, "scroll", this.clearMouseListener);
             this.element.hasScrollEvent = true;
         }
-        
+
         if (!this.element.scrolls) {
             this.element.scrolls = [
                 (document.documentElement.scrollLeft
@@ -10341,7 +10341,7 @@
                 (document.documentElement.clientTop  || 0)
             ];
         }
-        
+
         if (!this.element.offsets) {
             this.element.offsets = OpenLayers.Util.pagePosition(this.element);
             this.element.offsets[0] += this.element.scrolls[0];
@@ -10349,10 +10349,10 @@
         }
         return new OpenLayers.Pixel(
             (evt.clientX + this.element.scrolls[0]) - this.element.offsets[0]
-                         - this.element.lefttop[0], 
+                         - this.element.lefttop[0],
             (evt.clientY + this.element.scrolls[1]) - this.element.offsets[1]
                          - this.element.lefttop[1]
-        ); 
+        );
     },
 
     CLASS_NAME: "OpenLayers.Events"
@@ -10376,13 +10376,13 @@
  *     of OpenLayers.Format are expected to have read and write methods.
  */
 OpenLayers.Format = OpenLayers.Class({
-    
+
     /**
      * Property: options
      * {Object} A reference to options passed to the constructor.
      */
     options: null,
-    
+
     /**
      * APIProperty: externalProjection
      * {<OpenLayers.Projection>} When passed a externalProjection and
@@ -10390,7 +10390,7 @@
      *     reads or writes. The externalProjection is the projection used by
      *     the content which is passed into read or which comes out of write.
      *     In order to reproject, a projection transformation function for the
-     *     specified projections must be available. This support may be 
+     *     specified projections must be available. This support may be
      *     provided via proj4js or via a custom transformation function. See
      *     {<OpenLayers.Projection.addTransform>} for more information on
      *     custom transformations.
@@ -10444,7 +10444,7 @@
         OpenLayers.Util.extend(this, options);
         this.options = options;
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up.
@@ -10455,8 +10455,8 @@
     /**
      * Method: read
      * Read data from a string, and return an object whose type depends on the
-     * subclass. 
-     * 
+     * subclass.
+     *
      * Parameters:
      * data - {string} Data to read/parse.
      *
@@ -10466,10 +10466,10 @@
     read: function(data) {
         OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));
     },
-    
+
     /**
      * Method: write
-     * Accept an object, and return a string. 
+     * Accept an object, and return a string.
      *
      * Parameters:
      * object - {Object} Object to be serialized
@@ -10482,7 +10482,7 @@
     },
 
     CLASS_NAME: "OpenLayers.Format"
-});     
+});
 /* ======================================================================
     OpenLayers/Lang/en.js
    ====================================================================== */
@@ -10579,7 +10579,7 @@
     'reprojectDeprecated':
         "You are using the 'reproject' option " +
         "on the ${layerName} layer. This option is deprecated: " +
-        "its use was designed to support displaying data over commercial " + 
+        "its use was designed to support displaying data over commercial " +
         "basemaps, but that functionality should now be achieved by using " +
         "Spherical Mercator support. More information is available from " +
         "http://trac.openlayers.org/wiki/SphericalMercator.",
@@ -10604,7 +10604,7 @@
     // console message
     'pagePositionFailed':
         "OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",
-                    
+
     'end': '',
 
     // console message
@@ -10625,36 +10625,36 @@
 
 /**
  * Class: OpenLayers.Popup.AnchoredBubble
- * 
- * Inherits from: 
+ *
+ * Inherits from:
  *  - <OpenLayers.Popup.Anchored>
  */
-OpenLayers.Popup.AnchoredBubble = 
+OpenLayers.Popup.AnchoredBubble =
   OpenLayers.Class(OpenLayers.Popup.Anchored, {
 
     /**
      * Property: rounded
      * {Boolean} Has the popup been rounded yet?
      */
-    rounded: false, 
-    
-    /** 
+    rounded: false,
+
+    /**
      * Constructor: OpenLayers.Popup.AnchoredBubble
-     * 
+     *
      * Parameters:
      * id - {String}
      * lonlat - {<OpenLayers.LonLat>}
      * contentSize - {<OpenLayers.Size>}
      * contentHTML - {String}
-     * anchor - {Object} Object to which we'll anchor the popup. Must expose 
-     *     a 'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>) 
+     * anchor - {Object} Object to which we'll anchor the popup. Must expose
+     *     a 'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>)
      *     (Note that this is generally an <OpenLayers.Icon>).
      * closeBox - {Boolean}
      * closeBoxCallback - {Function} Function to be called on closeBox click.
      */
     initialize:function(id, lonlat, contentSize, contentHTML, anchor, closeBox,
                         closeBoxCallback) {
-        
+
         this.padding = new OpenLayers.Bounds(
             0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,
             0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE
@@ -10662,23 +10662,23 @@
         OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
     },
 
-    /** 
+    /**
      * Method: draw
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {DOMElement} Reference to a div that contains the drawn popup.
      */
     draw: function(px) {
-        
+
         OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments);
 
         this.setContentHTML();
-        
-        //set the popup color and opacity           
-        this.setBackgroundColor(); 
+
+        //set the popup color and opacity
+        this.setBackgroundColor();
         this.setOpacity();
 
         return this.div;
@@ -10695,71 +10695,71 @@
 
     /**
      * APIMethod: setSize
-     * 
+     *
      * Parameters:
-     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's
      *     contents div (in pixels).
      */
-    setSize:function(contentSize) { 
+    setSize:function(contentSize) {
         OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
 
         this.setRicoCorners();
-    },  
+    },
 
     /**
      * APIMethod: setBackgroundColor
-     * 
+     *
      * Parameters:
      * color - {String}
      */
-    setBackgroundColor:function(color) { 
+    setBackgroundColor:function(color) {
         if (color != undefined) {
-            this.backgroundColor = color; 
+            this.backgroundColor = color;
         }
-        
+
         if (this.div != null) {
             if (this.contentDiv != null) {
                 this.div.style.background = "transparent";
-                OpenLayers.Rico.Corner.changeColor(this.groupDiv, 
+                OpenLayers.Rico.Corner.changeColor(this.groupDiv,
                                                    this.backgroundColor);
             }
         }
-    },  
-    
+    },
+
     /**
      * APIMethod: setOpacity
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * opacity - {float}
      */
-    setOpacity:function(opacity) { 
+    setOpacity:function(opacity) {
         OpenLayers.Popup.Anchored.prototype.setOpacity.call(this, opacity);
-        
+
         if (this.div != null) {
             if (this.groupDiv != null) {
-                OpenLayers.Rico.Corner.changeOpacity(this.groupDiv, 
+                OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,
                                                      this.opacity);
             }
         }
-    },  
- 
-    /** 
+    },
+
+    /**
      * Method: setBorder
      * Always sets border to 0. Bubble Popups can not have a border.
-     * 
+     *
      * Parameters:
      * border - {Integer}
      */
-    setBorder:function(border) { 
+    setBorder:function(border) {
         this.border = 0;
-    },      
- 
-    /** 
+    },
+
+    /**
      * Method: setRicoCorners
      * Update RICO corners according to the popup's current relative postion.
      */
     setRicoCorners:function() {
-    
+
         var corners = this.getCornersToRound(this.relativePosition);
         var options = {corners: corners,
                          color: this.backgroundColor,
@@ -10772,14 +10772,14 @@
         } else {
             OpenLayers.Rico.Corner.reRound(this.groupDiv, options);
             //set the popup color and opacity
-            this.setBackgroundColor(); 
+            this.setBackgroundColor();
             this.setOpacity();
         }
     },
 
-    /** 
+    /**
      * Method: getCornersToRound
-     *  
+     *
      * Returns:
      * {String} The proper corners string ("tr tl bl br") for rico to round.
      */
@@ -10787,7 +10787,7 @@
 
         var corners = ['tl', 'tr', 'bl', 'br'];
 
-        //we want to round all the corners _except_ the opposite one. 
+        //we want to round all the corners _except_ the opposite one.
         var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
         OpenLayers.Util.removeItem(corners, corner);
 
@@ -10808,7 +10808,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 /**
@@ -10818,7 +10818,7 @@
 /**
  * Class: OpenLayers.Projection
  * Class for coordinate transforms between coordinate systems.
- *     Depends on the proj4js library. If proj4js is not available, 
+ *     Depends on the proj4js library. If proj4js is not available,
  *     then this is just an empty stub.
  */
 OpenLayers.Projection = OpenLayers.Class({
@@ -10828,7 +10828,7 @@
      * {Object} Proj4js.Proj instance.
      */
     proj: null,
-    
+
     /**
      * Property: projCode
      * {String}
@@ -10837,8 +10837,8 @@
 
     /**
      * Constructor: OpenLayers.Projection
-     * This class offers several methods for interacting with a wrapped 
-     *     pro4js projection object. 
+     * This class offers several methods for interacting with a wrapped
+     *     pro4js projection object.
      *
      * Parameters:
      * projCode - {String} A string identifying the Well Known Identifier for
@@ -10856,7 +10856,7 @@
             this.proj = new Proj4js.Proj(projCode);
         }
     },
-    
+
     /**
      * APIMethod: getCode
      * Get the string SRS code.
@@ -10867,10 +10867,10 @@
     getCode: function() {
         return this.proj ? this.proj.srsCode : this.projCode;
     },
-   
+
     /**
      * APIMethod: getUnits
-     * Get the units string for the projection -- returns null if 
+     * Get the units string for the projection -- returns null if
      *     proj4js is not available.
      *
      * Returns:
@@ -10904,7 +10904,7 @@
             return this.getCode() == projection.getCode();
         } else {
             return false;
-        }    
+        }
     },
 
     /* Method: destroy
@@ -10914,21 +10914,21 @@
         delete this.proj;
         delete this.projCode;
     },
-    
-    CLASS_NAME: "OpenLayers.Projection" 
-});     
 
+    CLASS_NAME: "OpenLayers.Projection"
+});
+
 /**
  * Property: transforms
  * Transforms is an object, with from properties, each of which may
- * have a to property. This allows you to define projections without 
+ * have a to property. This allows you to define projections without
  * requiring support for proj4js to be included.
  *
  * This object has keys which correspond to a 'source' projection object.  The
  * keys should be strings, corresponding to the projection.getCode() value.
  * Each source projection object should have a set of destination projection
- * keys included in the object. 
- * 
+ * keys included in the object.
+ *
  * Each value in the destination object should be a transformation function,
  * where the function is expected to be passed an object with a .x and a .y
  * property.  The function should return the object, with the .x and .y
@@ -10964,7 +10964,7 @@
  * APIMethod: transform
  * Transform a point coordinate from one projection to another.  Note that
  *     the input point is transformed in place.
- * 
+ *
  * Parameters:
  * point - {{OpenLayers.Geometry.Point> | Object} An object with x and y
  *     properties representing coordinates in those dimensions.
@@ -10977,10 +10977,10 @@
 OpenLayers.Projection.transform = function(point, source, dest) {
     if (source.proj && dest.proj) {
         point = Proj4js.transform(source.proj, dest.proj, point);
-    } else if (source && dest && 
-               OpenLayers.Projection.transforms[source.getCode()] && 
+    } else if (source && dest &&
+               OpenLayers.Projection.transforms[source.getCode()] &&
                OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]) {
-        OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point); 
+        OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);
     }
     return point;
 };
@@ -10998,18 +10998,18 @@
 
 /**
  * Class: OpenLayers.Renderer.SVG
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Renderer.Elements>
  */
 OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
 
-    /** 
+    /**
      * Property: xmlns
      * {String}
      */
     xmlns: "http://www.w3.org/2000/svg",
-    
+
     /**
      * Property: xlinkns
      * {String}
@@ -11018,8 +11018,8 @@
 
     /**
      * Constant: MAX_PIXEL
-     * {Integer} Firefox has a limitation where values larger or smaller than  
-     *           about 15000 in an SVG document lock the browser up. This 
+     * {Integer} Firefox has a limitation where values larger or smaller than
+     *           about 15000 in an SVG document lock the browser up. This
      *           works around it.
      */
     MAX_PIXEL: 15000,
@@ -11029,13 +11029,13 @@
      * {Object} Hash with "x" and "y" properties
      */
     translationParameters: null,
-    
+
     /**
      * Property: symbolSize
      * {Object} Cache for symbol sizes according to their svg coordinate space
      */
     symbolSize: {},
-    
+
     /**
      * Property: isGecko
      * {Boolean}
@@ -11044,15 +11044,15 @@
 
     /**
      * Constructor: OpenLayers.Renderer.SVG
-     * 
+     *
      * Parameters:
      * containerID - {String}
      */
     initialize: function(containerID) {
-        if (!this.supported()) { 
-            return; 
+        if (!this.supported()) {
+            return;
         }
-        OpenLayers.Renderer.Elements.prototype.initialize.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
                                                                 arguments);
         this.translationParameters = {x: 0, y: 0};
         this.isGecko = (navigator.userAgent.toLowerCase().indexOf("gecko/") != -1);
@@ -11064,20 +11064,20 @@
     destroy: function() {
         OpenLayers.Renderer.Elements.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: supported
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the browser supports the SVG renderer
      */
     supported: function() {
         var svgFeature = "http://www.w3.org/TR/SVG11/feature#";
-        return (document.implementation && 
-           (document.implementation.hasFeature("org.w3c.svg", "1.0") || 
-            document.implementation.hasFeature(svgFeature + "SVG", "1.1") || 
+        return (document.implementation &&
+           (document.implementation.hasFeature("org.w3c.svg", "1.0") ||
+            document.implementation.hasFeature(svgFeature + "SVG", "1.1") ||
             document.implementation.hasFeature(svgFeature + "BasicStructure", "1.1") ));
-    },    
+    },
 
     /**
      * Method: inValidRange
@@ -11088,11 +11088,11 @@
      * y      - {Integer}
      * xyOnly - {Boolean} whether or not to just check for x and y, which means
      *     to not take the current translation parameters into account if true.
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the 'x' and 'y' coordinates are in the  
+     * {Boolean} Whether or not the 'x' and 'y' coordinates are in the
      *           valid range.
-     */ 
+     */
     inValidRange: function(x, y, xyOnly) {
         var left = x + (xyOnly ? 0 : this.translationParameters.x);
         var top = y + (xyOnly ? 0 : this.translationParameters.y);
@@ -11102,20 +11102,20 @@
 
     /**
      * Method: setExtent
-     * 
+     *
      * Parameters:
      * extent - {<OpenLayers.Bounds>}
      * resolutionChanged - {Boolean}
-     * 
+     *
      * Returns:
      * {Boolean} true to notify the layer that the new extent does not exceed
      *     the coordinate range, and the features will not need to be redrawn.
      *     False otherwise.
      */
     setExtent: function(extent, resolutionChanged) {
-        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
                                                                arguments);
-        
+
         var resolution = this.getResolution();
         var left = -extent.left / resolution;
         var top = extent.top / resolution;
@@ -11140,15 +11140,15 @@
             return inRange;
         }
     },
-    
+
     /**
      * Method: translate
      * Transforms the SVG coordinate system
-     * 
+     *
      * Parameters:
      * x - {Float}
      * y - {Float}
-     * 
+     *
      * Returns:
      * {Boolean} true if the translation parameters are in the valid coordinates
      *     range, false otherwise.
@@ -11170,24 +11170,24 @@
     /**
      * Method: setSize
      * Sets the size of the drawing surface.
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>} The size of the drawing surface
      */
     setSize: function(size) {
         OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
-        
+
         this.rendererRoot.setAttributeNS(null, "width", this.size.w);
         this.rendererRoot.setAttributeNS(null, "height", this.size.h);
     },
 
-    /** 
-     * Method: getNodeType 
-     * 
+    /**
+     * Method: getNodeType
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>}
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} The corresponding node type for the specified geometry
      */
@@ -11223,17 +11223,17 @@
         return nodeType;
     },
 
-    /** 
+    /**
      * Method: setStyle
      * Use to set all the style attributes to a SVG node.
-     * 
+     *
      * Takes care to adjust stroke width and point radius to be
      * resolution-relative
      *
      * Parameters:
      * node - {SVGDomElement} An SVG element to decorate
      * style - {Object}
-     * options - {Object} Currently supported options include 
+     * options - {Object} Currently supported options include
      *                              'isFilled' {Boolean} and
      *                              'isStroked' {Boolean}
      */
@@ -11249,8 +11249,8 @@
                 node.style.visibility = "hidden";
             } else if (style.externalGraphic) {
                 pos = this.getPosition(node);
-                
-        		if (style.graphicTitle) {
+
+                if (style.graphicTitle) {
                     node.setAttributeNS(null, "title", style.graphicTitle);
                 }
                 if (style.graphicWidth && style.graphicHeight) {
@@ -11266,7 +11266,7 @@
                     style.graphicYOffset : -(0.5 * height);
 
                 var opacity = style.graphicOpacity || style.fillOpacity;
-                
+
                 node.setAttributeNS(null, "x", (pos.x + xOffset).toFixed());
                 node.setAttributeNS(null, "y", (pos.y + yOffset).toFixed());
                 node.setAttributeNS(null, "width", width);
@@ -11281,7 +11281,7 @@
                 var href = "#" + id;
                 pos = this.getPosition(node);
                 widthFactor = this.symbolSize[id] / size;
-                
+
                 // remove the node from the dom before we modify it. This
                 // prevents various rendering issues in Safari and FF
                 var parent = node.parentNode;
@@ -11289,13 +11289,13 @@
                 if(parent) {
                     parent.removeChild(node);
                 }
-                
+
                 node.setAttributeNS(this.xlinkns, "href", href);
                 node.setAttributeNS(null, "width", size);
                 node.setAttributeNS(null, "height", size);
                 node.setAttributeNS(null, "x", pos.x - offset);
                 node.setAttributeNS(null, "y", pos.y - offset);
-                
+
                 // now that the node has all its new properties, insert it
                 // back into the dom where it was
                 if(nextSibling) {
@@ -11313,7 +11313,7 @@
                 node.setAttributeNS(null, "transform", rotation);
             }
         }
-        
+
         if (options.isFilled) {
             node.setAttributeNS(null, "fill", style.fillColor);
             node.setAttributeNS(null, "fill-opacity", style.fillOpacity);
@@ -11334,25 +11334,25 @@
         } else {
             node.setAttributeNS(null, "stroke", "none");
         }
-        
+
         if (style.pointerEvents) {
             node.setAttributeNS(null, "pointer-events", style.pointerEvents);
         }
-		        
+
         if (style.cursor != null) {
             node.setAttributeNS(null, "cursor", style.cursor);
         }
-        
+
         return node;
     },
 
-    /** 
+    /**
      * Method: dashStyle
-     * 
+     *
      * Parameters:
      * style - {Object}
      * widthFactor - {Number}
-     * 
+     *
      * Returns:
      * {String} A SVG compliant 'stroke-dasharray' value
      */
@@ -11376,14 +11376,14 @@
                 return style.strokeDashstyle.replace(/ /g, ",");
         }
     },
-    
-    /** 
+
+    /**
      * Method: createNode
-     * 
+     *
      * Parameters:
      * type - {String} Kind of node to draw
      * id - {String} Id for node
-     * 
+     *
      * Returns:
      * {DOMElement} A new node of the given type and id
      */
@@ -11392,26 +11392,26 @@
         if (id) {
             node.setAttributeNS(null, "id", id);
         }
-        return node;    
+        return node;
     },
-    
-    /** 
+
+    /**
      * Method: nodeTypeCompare
-     * 
+     *
      * Parameters:
      * node - {SVGDomElement} An SVG element
      * type - {String} Kind of node
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the specified node is of the specified type
      */
     nodeTypeCompare: function(node, type) {
         return (type == node.nodeName);
     },
-   
+
     /**
      * Method: createRenderRoot
-     * 
+     *
      * Returns:
      * {DOMElement} The specific render engine's root element
      */
@@ -11421,10 +11421,10 @@
 
     /**
      * Method: createRoot
-     * 
+     *
      * Parameter:
      * suffix - {String} suffix to append to the id
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -11453,14 +11453,14 @@
     /**
      * Method: drawPoint
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the point
-     */ 
+     */
     drawPoint: function(node, geometry) {
         return this.drawCircle(node, geometry, 1);
     },
@@ -11468,12 +11468,12 @@
     /**
      * Method: drawCircle
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * radius - {Float}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the circle
      */
@@ -11482,73 +11482,73 @@
         var x = (geometry.x / resolution + this.left);
         var y = (this.top - geometry.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             node.setAttributeNS(null, "cx", x);
             node.setAttributeNS(null, "cy", y);
             node.setAttributeNS(null, "r", radius);
             return node;
         } else {
             return false;
-        }    
-            
+        }
+
     },
-    
+
     /**
      * Method: drawLineString
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components of
      *     the linestring, or false if nothing could be drawn
-     */ 
+     */
     drawLineString: function(node, geometry) {
         var componentsResult = this.getComponentsString(geometry.components);
         if (componentsResult.path) {
             node.setAttributeNS(null, "points", componentsResult.path);
-            return (componentsResult.complete ? node : null);  
+            return (componentsResult.complete ? node : null);
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: drawLinearRing
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the linear ring, or false if nothing could be drawn
-     */ 
+     */
     drawLinearRing: function(node, geometry) {
         var componentsResult = this.getComponentsString(geometry.components);
         if (componentsResult.path) {
             node.setAttributeNS(null, "points", componentsResult.path);
-            return (componentsResult.complete ? node : null);  
+            return (componentsResult.complete ? node : null);
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: drawPolygon
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or null if the renderer could not draw all components
      *     of the polygon, or false if nothing could be drawn
-     */ 
+     */
     drawPolygon: function(node, geometry) {
         var d = "";
         var draw = true;
@@ -11573,26 +11573,26 @@
             return complete ? node : null;
         } else {
             return false;
-        }    
+        }
     },
-    
+
     /**
      * Method: drawRectangle
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the rectangle
-     */ 
+     */
     drawRectangle: function(node, geometry) {
         var resolution = this.getResolution();
         var x = (geometry.x / resolution + this.left);
         var y = (this.top - geometry.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             node.setAttributeNS(null, "x", x);
             node.setAttributeNS(null, "y", y);
             node.setAttributeNS(null, "width", geometry.width / resolution);
@@ -11602,18 +11602,18 @@
             return false;
         }
     },
-    
+
     /**
      * Method: drawSurface
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the renderer could not draw the surface
-     */ 
+     */
     drawSurface: function(node, geometry) {
 
         // create the svg path string representation
@@ -11640,31 +11640,31 @@
             return node;
         } else {
             return false;
-        }    
+        }
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
      */
     drawText: function(featureId, style, location) {
         var resolution = this.getResolution();
-        
+
         var x = (location.x / resolution + this.left);
         var y = (location.y / resolution - this.top);
-        
+
         var label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, "text");
         var tspan = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_tspan", "tspan");
 
         label.setAttributeNS(null, "x", x);
         label.setAttributeNS(null, "y", -y);
         label.setAttributeNS(null, "pointer-events", "none");
-        
+
         if (style.fontColor) {
             label.setAttributeNS(null, "fill", style.fontColor);
         }
@@ -11690,20 +11690,20 @@
         }
 
         tspan.textContent = style.label;
-        
+
         if(!label.parentNode) {
             label.appendChild(tspan);
             this.textRoot.appendChild(label);
-        }   
+        }
     },
-    
-    /** 
+
+    /**
      * Method: getComponentString
-     * 
+     *
      * Parameters:
      * components - {Array(<OpenLayers.Geometry.Point>)} Array of points
      * separator - {String} character between coordinate pairs. Defaults to ","
-     * 
+     *
      * Returns:
      * {Object} hash with properties "path" (the string created from the
      *     components and "complete" (false if the renderer was unable to
@@ -11747,13 +11747,13 @@
             complete: complete
         };
     },
-    
+
     /**
      * Method: clipLine
      * Given two points (one inside the valid range, and one outside),
      * clips the line betweeen the two points so that the new points are both
      * inside the valid range.
-     * 
+     *
      * Parameters:
      * badComponent - {<OpenLayers.Geometry.Point>)} original geometry of the
      *     invalid point
@@ -11789,12 +11789,12 @@
         return x2 + "," + y2;
     },
 
-    /** 
+    /**
      * Method: getShortString
-     * 
+     *
      * Parameters:
      * point - {<OpenLayers.Geometry.Point>}
-     * 
+     *
      * Returns:
      * {String} or false if point is outside the valid range
      */
@@ -11803,20 +11803,20 @@
         var x = (point.x / resolution + this.left);
         var y = (this.top - point.y / resolution);
 
-        if (this.inValidRange(x, y)) { 
+        if (this.inValidRange(x, y)) {
             return x + "," + y;
         } else {
             return false;
         }
     },
-    
+
     /**
      * Method: getPosition
      * Finds the position of an svg node.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
-     * 
+     *
      * Returns:
      * {Object} hash with x and y properties, representing the coordinates
      *     within the svg coordinate system
@@ -11831,25 +11831,25 @@
     /**
      * Method: importSymbol
      * add a new symbol definition from the rendererer's symbol hash
-     * 
+     *
      * Parameters:
      * graphicName - {String} name of the symbol to import
-     * 
+     *
      * Returns:
      * {String} - id of the imported symbol
-     */      
+     */
     importSymbol: function (graphicName)  {
         if (!this.defs) {
             // create svg defs tag
             this.defs = this.createDefs();
         }
         var id = this.container.id + "-" + graphicName;
-        
+
         // check if symbol already exists in the defs
         if (document.getElementById(id) != null) {
             return id;
         }
-        
+
         var symbol = OpenLayers.Renderer.symbol[graphicName];
         if (!symbol) {
             throw new Error(graphicName + ' is not a valid symbol name');
@@ -11873,9 +11873,9 @@
             symbolExtent.top = Math.max(symbolExtent.top, y);
             points += " " + x + "," + y;
         }
-        
+
         node.setAttributeNS(null, "points", points);
-        
+
         var width = symbolExtent.getWidth();
         var height = symbolExtent.getHeight();
         // create a viewBox three times as large as the symbol itself,
@@ -11884,7 +11884,7 @@
                         symbolExtent.bottom - height, width * 3, height * 3];
         symbolNode.setAttributeNS(null, "viewBox", viewBox.join(" "));
         this.symbolSize[id] = Math.max(width, height) * 3;
-        
+
         this.defs.appendChild(symbolNode);
         return symbolNode.id;
     },
@@ -11914,7 +11914,7 @@
     // bottom to the top of the baseline, so -35% moves the text to
     // the center of the baseline.
     "t": "-70%",
-    "b": "0"    
+    "b": "0"
 };
 /* ======================================================================
     OpenLayers/Renderer/VML.js
@@ -11932,9 +11932,9 @@
  * Class: OpenLayers.Renderer.VML
  * Render vector features in browsers with VML capability.  Construct a new
  * VML renderer with the <OpenLayers.Renderer.VML> constructor.
- * 
- * Note that for all calculations in this class, we use toFixed() to round a 
- * float value to an integer. This is done because it seems that VML doesn't 
+ *
+ * Note that for all calculations in this class, we use toFixed() to round a
+ * float value to an integer. This is done because it seems that VML doesn't
  * support float values.
  *
  * Inherits from:
@@ -11947,7 +11947,7 @@
      * {String} XML Namespace URN
      */
     xmlns: "urn:schemas-microsoft-com:vml",
-    
+
     /**
      * Property: symbolCache
      * {DOMElement} node holding symbols. This hash is keyed by symbol name,
@@ -11960,7 +11960,7 @@
      * {Object} Hash with "x" and "y" properties
      */
     offset: null,
-    
+
     /**
      * Constructor: OpenLayers.Renderer.VML
      * Create a new VML renderer.
@@ -11969,21 +11969,21 @@
      * containerID - {String} The id for the element that contains the renderer
      */
     initialize: function(containerID) {
-        if (!this.supported()) { 
-            return; 
+        if (!this.supported()) {
+            return;
         }
         if (!document.namespaces.olv) {
             document.namespaces.add("olv", this.xmlns);
             var style = document.createStyleSheet();
-            var shapes = ['shape','rect', 'oval', 'fill', 'stroke', 'imagedata', 'group','textbox']; 
+            var shapes = ['shape','rect', 'oval', 'fill', 'stroke', 'imagedata', 'group','textbox'];
             for (var i = 0, len = shapes.length; i < len; i++) {
 
                 style.addRule('olv\\:' + shapes[i], "behavior: url(#default#VML); " +
                               "position: absolute; display: inline-block;");
-            }                  
+            }
         }
-        
-        OpenLayers.Renderer.Elements.prototype.initialize.apply(this, 
+
+        OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
                                                                 arguments);
         this.offset = {x: 0, y: 0};
     },
@@ -12005,7 +12005,7 @@
      */
     supported: function() {
         return !!(document.namespaces);
-    },    
+    },
 
     /**
      * Method: setExtent
@@ -12014,16 +12014,16 @@
      * Parameters:
      * extent - {<OpenLayers.Bounds>}
      * resolutionChanged - {Boolean}
-     * 
+     *
      * Returns:
      * {Boolean} true to notify the layer that the new extent does not exceed
      *     the coordinate range, and the features will not need to be redrawn.
      */
     setExtent: function(extent, resolutionChanged) {
-        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, 
+        OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
                                                                arguments);
         var resolution = this.getResolution();
-    
+
         var left = extent.left/resolution;
         var top = extent.top/resolution - this.size.h;
         if (resolutionChanged) {
@@ -12035,7 +12035,7 @@
             top = top - this.offset.y;
         }
 
-        
+
         var org = left + " " + top;
         this.root.coordorigin = org;
         var roots = [this.root, this.vectorRoot, this.textRoot];
@@ -12045,12 +12045,12 @@
 
             var size = this.size.w + " " + this.size.h;
             root.coordsize = size;
-            
+
         }
-        // flip the VML display Y axis upside down so it 
+        // flip the VML display Y axis upside down so it
         // matches the display Y axis of the map
         this.root.style.flip = "y";
-        
+
         return true;
     },
 
@@ -12064,7 +12064,7 @@
      */
     setSize: function(size) {
         OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
-        
+
         // setting width and height on all roots to avoid flicker which we
         // would get with 100% width and height on child roots
         var roots = [
@@ -12129,7 +12129,7 @@
      * Parameters:
      * node - {DOMElement} An VML element to decorate
      * style - {Object}
-     * options - {Object} Currently supported options include 
+     * options - {Object} Currently supported options include
      *                              'isFilled' {Boolean} and
      *                              'isStroked' {Boolean}
      * geometry - {<OpenLayers.Geometry>}
@@ -12138,12 +12138,12 @@
         style = style  || node._style;
         options = options || node._options;
         var widthFactor = 1;
-        
+
         if (node._geometryClass == "OpenLayers.Geometry.Point") {
             if (style.externalGraphic) {
-        		if (style.graphicTitle) {
+                if (style.graphicTitle) {
                     node.title=style.graphicTitle;
-                } 
+                }
                 var width = style.graphicWidth || style.graphicHeight;
                 var height = style.graphicHeight || style.graphicWidth;
                 width = width ? width : style.pointRadius*2;
@@ -12154,13 +12154,13 @@
                     style.graphicXOffset : -(0.5 * width);
                 var yOffset = (style.graphicYOffset != undefined) ?
                     style.graphicYOffset : -(0.5 * height);
-                
+
                 node.style.left = ((geometry.x/resolution - this.offset.x)+xOffset).toFixed();
                 node.style.top = ((geometry.y/resolution - this.offset.y)-(yOffset+height)).toFixed();
                 node.style.width = width + "px";
                 node.style.height = height + "px";
                 node.style.flip = "y";
-                
+
                 // modify style/options for fill and stroke styling below
                 style.fillColor = "none";
                 options.isStroked = false;
@@ -12169,7 +12169,7 @@
                 node.path = cache.path;
                 node.coordorigin = cache.left + "," + cache.bottom;
                 var size = cache.size;
-                node.coordsize = size + "," + size;        
+                node.coordsize = size + "," + size;
                 this.drawCircle(node, geometry, style.pointRadius);
                 node.style.flip = "y";
             } else {
@@ -12177,11 +12177,11 @@
             }
         }
 
-        // fill 
-        if (options.isFilled) { 
-            node.fillcolor = style.fillColor; 
-        } else { 
-            node.filled = "false"; 
+        // fill
+        if (options.isFilled) {
+            node.fillcolor = style.fillColor;
+        } else {
+            node.filled = "false";
         }
         var fills = node.getElementsByTagName("fill");
         var fill = (fills.length == 0) ? null : fills[0];
@@ -12202,13 +12202,13 @@
                 if (style.graphicOpacity) {
                     fill.opacity = style.graphicOpacity;
                 }
-                
+
                 fill.src = style.externalGraphic;
                 fill.type = "frame";
-                
+
                 if (!(style.graphicWidth && style.graphicHeight)) {
                   fill.aspect = "atmost";
-                }                
+                }
             }
             if (fill.parentNode != node) {
                 node.appendChild(fill);
@@ -12229,12 +12229,12 @@
             }
         }
 
-        // stroke 
-        if (options.isStroked) { 
-            node.strokecolor = style.strokeColor; 
-            node.strokeweight = style.strokeWidth + "px"; 
-        } else { 
-            node.stroked = false; 
+        // stroke
+        if (options.isStroked) {
+            node.strokecolor = style.strokeColor;
+            node.strokeweight = style.strokeWidth + "px";
+        } else {
+            node.stroked = false;
         }
         var strokes = node.getElementsByTagName("stroke");
         var stroke = (strokes.length == 0) ? null : strokes[0];
@@ -12251,7 +12251,7 @@
             stroke.endcap = !style.strokeLinecap || style.strokeLinecap == 'butt' ? 'flat' : style.strokeLinecap;
             stroke.dashstyle = this.dashStyle(style);
         }
-        
+
         if (style.cursor != "inherit" && style.cursor != null) {
             node.style.cursor = style.cursor;
         }
@@ -12271,7 +12271,7 @@
      * insertion point of the rotated image, because DXImageTransform.Matrix
      * does the rotation without the ability to specify a rotation center
      * point.
-     * 
+     *
      * Parameters:
      * node    - {DOMElement}
      * xOffset - {Number} rotation center relative to image, x coordinate
@@ -12280,7 +12280,7 @@
     graphicRotate: function(node, xOffset, yOffset) {
         var style = style || node._style;
         var options = node._options;
-        
+
         var aspectRatio, size;
         if (!(style.graphicWidth && style.graphicHeight)) {
             // load the image to determine its size
@@ -12289,7 +12289,7 @@
                 if(img.readyState == "complete" ||
                         img.readyState == "interactive") {
                     aspectRatio = img.width / img.height;
-                    size = Math.max(style.pointRadius * 2, 
+                    size = Math.max(style.pointRadius * 2,
                         style.graphicWidth || 0,
                         style.graphicHeight || 0);
                     xOffset = xOffset * aspectRatio;
@@ -12299,19 +12299,19 @@
                 }
             }, this);
             img.src = style.externalGraphic;
-            
+
             // will be called again by the onreadystate handler
             return;
         } else {
             size = Math.max(style.graphicWidth, style.graphicHeight);
             aspectRatio = style.graphicWidth / style.graphicHeight;
         }
-        
+
         var width = Math.round(style.graphicWidth || size * aspectRatio);
         var height = Math.round(style.graphicHeight || size);
         node.style.width = width + "px";
         node.style.height = height + "px";
-        
+
         // Three steps are required to remove artefacts for images with
         // transparent backgrounds (resulting from using DXImageTransform
         // filters on svg objects), while preserving awareness for browser
@@ -12330,7 +12330,7 @@
         image.style.height = height + "px";
         image.src = style.externalGraphic;
         image.style.filter =
-            "progid:DXImageTransform.Microsoft.AlphaImageLoader(" + 
+            "progid:DXImageTransform.Microsoft.AlphaImageLoader(" +
             "src='', sizingMethod='scale')";
 
         var rotation = style.rotation * Math.PI / 180;
@@ -12346,8 +12346,8 @@
         // set the opacity (needed for the imagedata)
         var opacity = style.graphicOpacity || style.fillOpacity;
         if (opacity && opacity != 1) {
-            filter += 
-                "progid:DXImageTransform.Microsoft.BasicImage(opacity=" + 
+            filter +=
+                "progid:DXImageTransform.Microsoft.BasicImage(opacity=" +
                 opacity+")\n";
         }
         node.style.filter = filter;
@@ -12370,7 +12370,7 @@
      * and strokecolor to "none" correctly before the fill node is appended to
      * a visible vml node. This method takes care of that and sets fillcolor
      * and strokecolor again if needed.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      */
@@ -12390,9 +12390,9 @@
 
     /**
      * Method: setNodeDimension
-     * Get the geometry's bounds, convert it to our vml coordinate system, 
+     * Get the geometry's bounds, convert it to our vml coordinate system,
      * then set the node's position, size, and local coordinate system.
-     *   
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
@@ -12402,30 +12402,30 @@
         var bbox = geometry.getBounds();
         if(bbox) {
             var resolution = this.getResolution();
-        
-            var scaledBox = 
+
+            var scaledBox =
                 new OpenLayers.Bounds((bbox.left/resolution - this.offset.x).toFixed(),
                                       (bbox.bottom/resolution - this.offset.y).toFixed(),
                                       (bbox.right/resolution - this.offset.x).toFixed(),
                                       (bbox.top/resolution - this.offset.y).toFixed());
-            
+
             // Set the internal coordinate system to draw the path
             node.style.left = scaledBox.left + "px";
             node.style.top = scaledBox.top + "px";
             node.style.width = scaledBox.getWidth() + "px";
             node.style.height = scaledBox.getHeight() + "px";
-    
+
             node.coordorigin = scaledBox.left + " " + scaledBox.top;
             node.coordsize = scaledBox.getWidth()+ " " + scaledBox.getHeight();
         }
     },
-    
-    /** 
+
+    /**
      * Method: dashStyle
-     * 
+     *
      * Parameters:
      * style - {Object}
-     * 
+     *
      * Returns:
      * {String} A VML compliant 'stroke-dasharray' value
      */
@@ -12471,15 +12471,15 @@
         if (id) {
             node.id = id;
         }
-        
+
         // IE hack to make elements unselectable, to prevent 'blue flash'
         // while dragging vectors; #1410
         node.unselectable = 'on';
         node.onselectstart = function() { return(false); };
-        
-        return node;    
+
+        return node;
     },
-    
+
     /**
      * Method: nodeTypeCompare
      * Determine whether a node is of a given type
@@ -12524,7 +12524,7 @@
     /**
      * Method: createRoot
      * Create the main root element
-     * 
+     *
      * Parameters:
      * suffix - {String} suffix to append to the id
      *
@@ -12534,21 +12534,21 @@
     createRoot: function(suffix) {
         return this.nodeFactory(this.container.id + suffix, "olv:group");
     },
-    
+
     /**************************************
      *                                    *
      *     GEOMETRY DRAWING FUNCTIONS     *
      *                                    *
      **************************************/
-    
+
     /**
      * Method: drawPoint
      * Render a point
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the point could not be drawn
      */
@@ -12560,12 +12560,12 @@
      * Method: drawCircle
      * Render a circle.
      * Size and Center a circle given geometry (x,y center) and radius
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * radius - {float}
-     * 
+     *
      * Returns:
      * {DOMElement} or false if the circle could not ne drawn
      */
@@ -12575,9 +12575,9 @@
 
             node.style.left = ((geometry.x /resolution - this.offset.x).toFixed() - radius) + "px";
             node.style.top = ((geometry.y /resolution - this.offset.y).toFixed() - radius) + "px";
-    
+
             var diameter = radius * 2;
-            
+
             node.style.width = diameter + "px";
             node.style.height = diameter + "px";
             return node;
@@ -12589,11 +12589,11 @@
     /**
      * Method: drawLineString
      * Render a linestring.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12604,11 +12604,11 @@
     /**
      * Method: drawLinearRing
      * Render a linearring
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12619,12 +12619,12 @@
     /**
      * Method: DrawLine
      * Render a line.
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
      * closeLine - {Boolean} Close the line? (make it a ring?)
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12651,11 +12651,11 @@
     /**
      * Method: drawPolygon
      * Render a polygon
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12663,7 +12663,7 @@
         this.setNodeDimension(node, geometry);
 
         var resolution = this.getResolution();
-    
+
         var path = [];
         var linearRing, i, j, len, ilen, comp, x, y;
         for (j = 0, len=geometry.components.length; j<len; j++) {
@@ -12689,30 +12689,30 @@
     /**
      * Method: drawRectangle
      * Render a rectangle
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
     drawRectangle: function(node, geometry) {
         var resolution = this.getResolution();
-    
+
         node.style.left = (geometry.x/resolution - this.offset.x) + "px";
         node.style.top = (geometry.y/resolution - this.offset.y) + "px";
         node.style.width = geometry.width/resolution + "px";
         node.style.height = geometry.height/resolution + "px";
-        
+
         return node;
     },
-    
+
     /**
      * Method: drawText
      * This method is only called by the renderer itself.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * featureId - {String}
      * style -
      * location - {<OpenLayers.Geometry.Point>}
@@ -12720,7 +12720,7 @@
     drawText: function(featureId, style, location) {
         var label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, "olv:rect");
         var textbox = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox");
-        
+
         var resolution = this.getResolution();
         label.style.left = (location.x/resolution - this.offset.x).toFixed() + "px";
         label.style.top = (location.y/resolution - this.offset.y).toFixed() + "px";
@@ -12762,11 +12762,11 @@
 
     /**
      * Method: drawSurface
-     * 
+     *
      * Parameters:
      * node - {DOMElement}
      * geometry - {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {DOMElement}
      */
@@ -12775,7 +12775,7 @@
         this.setNodeDimension(node, geometry);
 
         var resolution = this.getResolution();
-    
+
         var path = [];
         var comp, x, y;
         for (var i=0, len=geometry.components.length; i<len; i++) {
@@ -12794,17 +12794,17 @@
         node.path = path.join("");
         return node;
     },
-    
+
     /**
      * Method: moveRoot
      * moves this renderer's root to a different renderer.
-     * 
+     *
      * Parameters:
      * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
      * root - {DOMElement} optional root node. To be used when this renderer
      *     holds roots from multiple layers to tell this method which one to
      *     detach
-     * 
+     *
      * Returns:
      * {Boolean} true if successful, false otherwise
      */
@@ -12817,26 +12817,26 @@
         OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this, arguments);
         layer && layer.redraw();
     },
-    
+
     /**
      * Method: importSymbol
      * add a new symbol definition from the rendererer's symbol hash
-     * 
+     *
      * Parameters:
      * graphicName - {String} name of the symbol to import
-     * 
+     *
      * Returns:
      * {Object} - hash of {DOMElement} "symbol" and {Number} "size"
-     */      
+     */
     importSymbol: function (graphicName)  {
         var id = this.container.id + "-" + graphicName;
-        
+
         // check if symbol already exists in the cache
         var cache = this.symbolCache[id];
         if (cache) {
             return cache;
         }
-        
+
         var symbol = OpenLayers.Renderer.symbol[graphicName];
         if (!symbol) {
             throw new Error(graphicName + ' is not a valid symbol name');
@@ -12845,7 +12845,7 @@
 
         var symbolExtent = new OpenLayers.Bounds(
                                     Number.MAX_VALUE, Number.MAX_VALUE, 0, 0);
-        
+
         var pathitems = ["m"];
         for (var i=0; i<symbol.length; i=i+2) {
             x = symbol[i];
@@ -12872,7 +12872,7 @@
             symbolExtent.left = symbolExtent.left - diff;
             symbolExtent.right = symbolExtent.right + diff;
         }
-        
+
         cache = {
             path: path,
             size: symbolExtent.getWidth(), // equals getHeight() now
@@ -12880,10 +12880,10 @@
             bottom: symbolExtent.bottom
         };
         this.symbolCache[id] = cache;
-        
+
         return cache;
     },
-    
+
     CLASS_NAME: "OpenLayers.Renderer.VML"
 });
 
@@ -12914,70 +12914,70 @@
  */
 
 /*
- * Class: OpenLayers.Tile 
+ * Class: OpenLayers.Tile
  * This is a class designed to designate a single tile, however
- *     it is explicitly designed to do relatively little. Tiles store 
+ *     it is explicitly designed to do relatively little. Tiles store
  *     information about themselves -- such as the URL that they are related
- *     to, and their size - but do not add themselves to the layer div 
- *     automatically, for example. Create a new tile with the 
- *     <OpenLayers.Tile> constructor, or a subclass. 
- * 
+ *     to, and their size - but do not add themselves to the layer div
+ *     automatically, for example. Create a new tile with the
+ *     <OpenLayers.Tile> constructor, or a subclass.
+ *
  * TBD 3.0 - remove reference to url in above paragraph
- * 
+ *
  */
 OpenLayers.Tile = OpenLayers.Class({
-    
-    /** 
+
+    /**
      * Constant: EVENT_TYPES
      * {Array(String)} Supported application event types
      */
     EVENT_TYPES: [ "loadstart", "loadend", "reload", "unload"],
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *                       events on the tile.
      */
     events: null,
 
     /**
-     * Property: id 
+     * Property: id
      * {String} null
      */
     id: null,
-    
-    /** 
-     * Property: layer 
-     * {<OpenLayers.Layer>} layer the tile is attached to 
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer>} layer the tile is attached to
      */
     layer: null,
-    
+
     /**
      * Property: url
      * {String} url of the request.
      *
-     * TBD 3.0 
-     * Deprecated. The base tile class does not need an url. This should be 
+     * TBD 3.0
+     * Deprecated. The base tile class does not need an url. This should be
      * handled in subclasses. Does not belong here.
      */
     url: null,
 
-    /** 
-     * APIProperty: bounds 
+    /**
+     * APIProperty: bounds
      * {<OpenLayers.Bounds>} null
      */
     bounds: null,
-    
-    /** 
-     * Property: size 
+
+    /**
+     * Property: size
      * {<OpenLayers.Size>} null
      */
     size: null,
-    
-    /** 
-     * Property: position 
+
+    /**
+     * Property: position
      * {<OpenLayers.Pixel>} Top Left pixel of the tile
-     */    
+     */
     position: null,
 
     /**
@@ -12985,20 +12985,20 @@
      * {Boolean} Is the tile loading?
      */
     isLoading: false,
-        
+
     /** TBD 3.0 -- remove 'url' from the list of parameters to the constructor.
      *             there is no need for the base tile class to have a url.
-     * 
+     *
      * Constructor: OpenLayers.Tile
      * Constructor for a new <OpenLayers.Tile> instance.
-     * 
+     *
      * Parameters:
      * layer - {<OpenLayers.Layer>} layer that the tile will go in.
      * position - {<OpenLayers.Pixel>}
      * bounds - {<OpenLayers.Bounds>}
      * url - {<String>}
      * size - {<OpenLayers.Size>}
-     */   
+     */
     initialize: function(layer, position, bounds, url, size) {
         this.layer = layer;
         this.position = position.clone();
@@ -13008,7 +13008,7 @@
 
         //give the tile a unique id based on its BBOX.
         this.id = OpenLayers.Util.createUniqueID("Tile_");
-        
+
         this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES);
     },
 
@@ -13020,13 +13020,13 @@
      * still loading.
      */
     unload: function() {
-       if (this.isLoading) { 
-           this.isLoading = false; 
-           this.events.triggerEvent("unload"); 
+       if (this.isLoading) {
+           this.isLoading = false;
+           this.events.triggerEvent("unload");
        }
     },
-    
-    /** 
+
+    /**
      * APIMethod: destroy
      * Nullify references to prevent circular references and memory leaks.
      */
@@ -13035,11 +13035,11 @@
         this.bounds = null;
         this.size = null;
         this.position = null;
-        
+
         this.events.destroy();
         this.events = null;
     },
-    
+
     /**
      * Method: clone
      *
@@ -13051,27 +13051,27 @@
      */
     clone: function (obj) {
         if (obj == null) {
-            obj = new OpenLayers.Tile(this.layer, 
-                                      this.position, 
-                                      this.bounds, 
-                                      this.url, 
+            obj = new OpenLayers.Tile(this.layer,
+                                      this.position,
+                                      this.bounds,
+                                      this.url,
                                       this.size);
-        } 
-        
+        }
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(obj, this);
-        
+
         return obj;
     },
 
     /**
      * Method: draw
-     * Clear whatever is currently in the tile, then return whether or not 
+     * Clear whatever is currently in the tile, then return whether or not
      *     it should actually be re-drawn.
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the tile should actually be drawn. Note that 
-     *     this is not really the best way of doing things, but such is 
+     * {Boolean} Whether or not the tile should actually be drawn. Note that
+     *     this is not really the best way of doing things, but such is
      *     the way the code has been developed. Subclasses call this and
      *     depend on the return to know if they should draw or not.
      */
@@ -13079,18 +13079,18 @@
         var maxExtent = this.layer.maxExtent;
         var withinMaxExtent = (maxExtent &&
                                this.bounds.intersectsBounds(maxExtent, false));
- 
-        // The only case where we *wouldn't* want to draw the tile is if the 
+
+        // The only case where we *wouldn't* want to draw the tile is if the
         // tile is outside its layer's maxExtent.
         this.shouldDraw = (withinMaxExtent || this.layer.displayOutsideMaxExtent);
-                
+
         //clear tile's contents and mark as not drawn
         this.clear();
-        
+
         return this.shouldDraw;
     },
-    
-    /** 
+
+    /**
      * Method: moveTo
      * Reposition the tile.
      *
@@ -13112,75 +13112,75 @@
         }
     },
 
-    /** 
+    /**
      * Method: clear
-     * Clear the tile of any bounds/position-related data so that it can 
+     * Clear the tile of any bounds/position-related data so that it can
      *     be reused in a new location. To be implemented by subclasses.
      */
     clear: function() {
         // to be implemented by subclasses
     },
-    
-    /**   
+
+    /**
      * Method: getBoundsFromBaseLayer
-     * Take the pixel locations of the corner of the tile, and pass them to 
-     *     the base layer and ask for the location of those pixels, so that 
+     * Take the pixel locations of the corner of the tile, and pass them to
+     *     the base layer and ask for the location of those pixels, so that
      *     displaying tiles over Google works fine.
      *
      * Parameters:
      * position - {<OpenLayers.Pixel>}
      *
      * Returns:
-     * bounds - {<OpenLayers.Bounds>} 
+     * bounds - {<OpenLayers.Bounds>}
      */
     getBoundsFromBaseLayer: function(position) {
         var msg = OpenLayers.i18n('reprojectDeprecated',
                                               {'layerName':this.layer.name});
         OpenLayers.Console.warn(msg);
-        var topLeft = this.layer.map.getLonLatFromLayerPx(position); 
+        var topLeft = this.layer.map.getLonLatFromLayerPx(position);
         var bottomRightPx = position.clone();
         bottomRightPx.x += this.size.w;
         bottomRightPx.y += this.size.h;
-        var bottomRight = this.layer.map.getLonLatFromLayerPx(bottomRightPx); 
+        var bottomRight = this.layer.map.getLonLatFromLayerPx(bottomRightPx);
         // Handle the case where the base layer wraps around the date line.
-        // Google does this, and it breaks WMS servers to request bounds in 
-        // that fashion.  
+        // Google does this, and it breaks WMS servers to request bounds in
+        // that fashion.
         if (topLeft.lon > bottomRight.lon) {
             if (topLeft.lon < 0) {
                 topLeft.lon = -180 - (topLeft.lon+180);
             } else {
                 bottomRight.lon = 180+bottomRight.lon+180;
-            }        
+            }
         }
-        var bounds = new OpenLayers.Bounds(topLeft.lon, 
-                                       bottomRight.lat, 
-                                       bottomRight.lon, 
-                                       topLeft.lat);  
+        var bounds = new OpenLayers.Bounds(topLeft.lon,
+                                       bottomRight.lat,
+                                       bottomRight.lon,
+                                       topLeft.lat);
         return bounds;
-    },        
-        
-    /** 
+    },
+
+    /**
      * Method: showTile
      * Show the tile only if it should be drawn.
      */
-    showTile: function() { 
+    showTile: function() {
         if (this.shouldDraw) {
             this.show();
         }
     },
-    
-    /** 
+
+    /**
      * Method: show
      * Show the tile.  To be implemented by subclasses.
      */
     show: function() { },
-    
-    /** 
+
+    /**
      * Method: hide
      * Hide the tile.  To be implemented by subclasses.
      */
     hide: function() { },
-    
+
     CLASS_NAME: "OpenLayers.Tile"
 });
 /* ======================================================================
@@ -13207,7 +13207,7 @@
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
-    
+
     /**
      * Property: namespaces
      * {Object} Mapping of namespace aliases to namespace URIs.  Properties
@@ -13216,20 +13216,20 @@
      *     <setNamespace> to add or set a namespace alias after construction.
      */
     namespaces: null,
-    
+
     /**
      * Property: namespaceAlias
      * {Object} Mapping of namespace URI to namespace alias.  This object
      *     is read-only.  Use <setNamespace> to add or set a namespace alias.
      */
     namespaceAlias: null,
-    
+
     /**
      * Property: defaultPrefix
      * {String} The default namespace alias for creating element nodes.
      */
     defaultPrefix: null,
-    
+
     /**
      * Property: readers
      * Contains public functions, grouped by namespace prefix, that will
@@ -13239,7 +13239,7 @@
      *     from the parent.
      */
     readers: {},
-    
+
     /**
      * Property: writers
      * As a compliment to the <readers> property, this structure contains public
@@ -13280,7 +13280,7 @@
             this.namespaceAlias[this.namespaces[alias]] = alias;
         }
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up.
@@ -13289,7 +13289,7 @@
         this.xmldom = null;
         OpenLayers.Format.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: setNamespace
      * Set a namespace alias and URI for the format.
@@ -13309,7 +13309,7 @@
      *
      * Parameters:
      * text - {String} A XML string
-     
+
      * Returns:
      * {DOMElement} A DOM node
      */
@@ -13330,7 +13330,7 @@
                         xmldom = new ActiveXObject("Microsoft.XMLDOM");
                     } else {
                         xmldom = this.xmldom;
-                        
+
                     }
                     xmldom.loadXML(text);
                     return xmldom;
@@ -13361,7 +13361,7 @@
     /**
      * APIMethod: write
      * Serialize a DOM node into a XML string.
-     * 
+     *
      * Parameters:
      * node - {DOMElement} A DOM node.
      *
@@ -13400,7 +13400,7 @@
      * Parameters:
      * uri - {String} Namespace URI for the element.
      * name - {String} The qualified name of the element (prefix:localname).
-     * 
+     *
      * Returns:
      * {Element} A DOM element with namespace.
      */
@@ -13423,11 +13423,11 @@
      * Create a text node.  This node can be appended to another node with
      *     the standard node.appendChild method.  For cross-browser support,
      *     this method must be used instead of document.createTextNode.
-     * 
+     *
      * Parameters:
      * text - {String} The text of the node.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {DOMElement} A DOM text node.
      */
     createTextNode: function(text) {
@@ -13446,12 +13446,12 @@
      *     To return all nodes in a given namespace, use '*' for the name
      *     argument.  To return all nodes of a given (local) name, regardless
      *     of namespace, use '*' for the uri argument.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for other nodes.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the tag (without the prefix).
-     * 
+     *
      * Returns:
      * {NodeList} A node list or array of elements.
      */
@@ -13480,12 +13480,12 @@
     /**
      * APIMethod: getAttributeNodeNS
      * Get an attribute node given the namespace URI and local name.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for attribute nodes.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {DOMElement} An attribute node or null if none found.
      */
@@ -13514,12 +13514,12 @@
     /**
      * APIMethod: getAttributeNS
      * Get an attribute value given the namespace URI and local name.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for an attribute.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {String} An attribute value or and empty string if none found.
      */
@@ -13535,7 +13535,7 @@
         }
         return attributeValue;
     },
-    
+
     /**
      * APIMethod: getChildValue
      * Get the textual value of the node if it exists, or return an
@@ -13597,7 +13597,7 @@
         }
         return value;
     },
-    
+
     /**
      * APIMethod: isSimpleContent
      * Test if the given node has only simple content (i.e. no child element
@@ -13607,7 +13607,7 @@
      * node - {DOMElement} An element node.
      *
      * Returns:
-     * {Boolean} The node has no child element nodes (nodes of type 1). 
+     * {Boolean} The node has no child element nodes (nodes of type 1).
      */
     isSimpleContent: function(node) {
         var simple = true;
@@ -13619,7 +13619,7 @@
         }
         return simple;
     },
-    
+
     /**
      * APIMethod: contentType
      * Determine the content type for a given node.
@@ -13634,7 +13634,7 @@
     contentType: function(node) {
         var simple = false,
             complex = false;
-            
+
         var type = OpenLayers.Format.XML.CONTENT_TYPE.EMPTY;
 
         for(var child=node.firstChild; child; child=child.nextSibling) {
@@ -13651,7 +13651,7 @@
                 break;
             }
         }
-        
+
         if(complex && simple) {
             type = OpenLayers.Format.XML.CONTENT_TYPE.MIXED;
         } else if(complex) {
@@ -13666,12 +13666,12 @@
      * APIMethod: hasAttributeNS
      * Determine whether a node has a particular attribute matching the given
      *     name and namespace.
-     * 
+     *
      * Parameters:
      * node - {Element} Node on which to search for an attribute.
      * uri - {String} Namespace URI.
      * name - {String} Local name of the attribute (without the prefix).
-     * 
+     *
      * Returns:
      * {Boolean} The node has an attribute matching the name and namespace.
      */
@@ -13684,7 +13684,7 @@
         }
         return found;
     },
-    
+
     /**
      * APIMethod: setAttributeNS
      * Adds a new attribute or changes the value of an attribute with the given
@@ -13764,7 +13764,7 @@
         }
         return node;
     },
-    
+
     /**
      * Method: setAttributes
      * Set multiple attributes given key value pairs from an object.
@@ -13903,7 +13903,7 @@
     getChildEl: function(node, name, uri) {
         return node && this.getThisOrNextEl(node.firstChild, name, uri);
     },
-    
+
     /**
      * APIMethod: getNextEl
      * Get the next sibling element.  Optionally get the first sibling only
@@ -13922,7 +13922,7 @@
     getNextEl: function(node, name, uri) {
         return node && this.getThisOrNextEl(node.nextSibling, name, uri);
     },
-    
+
     /**
      * Method: getThisOrNextEl
      * Return this node or the next element node.  Optionally get the first
@@ -13964,7 +13964,7 @@
         }
         return sibling || null;
     },
-    
+
     /**
      * APIMethod: lookupNamespaceURI
      * Takes a prefix and returns the namespace URI associated with it on the given
@@ -13977,11 +13977,11 @@
      *
      * For browsers that don't support the attribute.ownerElement property, this
      *     method cannot be called on attribute nodes.
-     *     
+     *
      * Parameters:
      * node - {DOMElement} The node from which to start looking.
      * prefix - {String} The prefix to lookup or null to lookup the default namespace.
-     * 
+     *
      * Returns:
      * {String} The namespace URI for the given prefix.  Returns null if the prefix
      *     cannot be found or the node is the wrong type.
@@ -14025,7 +14025,7 @@
                     case 10: // DOCUMENT_TYPE_NODE
                     case 11: // DOCUMENT_FRAGMENT_NODE
                         break outer;
-                    default: 
+                    default:
                         // TEXT_NODE (3), CDATA_SECTION_NODE (4), ENTITY_REFERENCE_NODE (5),
                         // PROCESSING_INSTRUCTION_NODE (7), COMMENT_NODE (8)
                         uri =  this.lookupNamespaceURI(node.parentNode, prefix);
@@ -14035,11 +14035,11 @@
         }
         return uri;
     },
-    
-    CLASS_NAME: "OpenLayers.Format.XML" 
 
-});     
+    CLASS_NAME: "OpenLayers.Format.XML"
 
+});
+
 OpenLayers.Format.XML.CONTENT_TYPE = {EMPTY: 0, SIMPLE: 1, COMPLEX: 2, MIXED: 3};
 
 /**
@@ -14054,11 +14054,11 @@
  *
  * For browsers that don't support the attribute.ownerElement property, this
  *     method cannot be called on attribute nodes.
- *     
+ *
  * Parameters:
  * node - {DOMElement} The node from which to start looking.
  * prefix - {String} The prefix to lookup or null to lookup the default namespace.
- * 
+ *
  * Returns:
  * {String} The namespace URI for the given prefix.  Returns null if the prefix
  *     cannot be found or the node is the wrong type.
@@ -14094,7 +14094,7 @@
  *     correspond to these abstract events - so instead of listening for
  *     individual browser events, they only listen for the abstract events
  *     defined by the handler.
- *     
+ *
  * Handlers are created by controls, which ultimately have the responsibility
  *     of making changes to the the state of the application.  Handlers
  *     themselves may make temporary changes, but in general are expected to
@@ -14107,7 +14107,7 @@
      * {String}
      */
     id: null,
-        
+
     /**
      * APIProperty: control
      * {<OpenLayers.Control>}. The control that initialized this handler.  The
@@ -14146,7 +14146,7 @@
      * {Boolean}
      */
     active: false,
-    
+
     /**
      * Property: evt
      * {Event} This property references the last event handled by the handler.
@@ -14177,14 +14177,14 @@
         this.control = control;
         this.callbacks = callbacks;
         if (control.map) {
-            this.setMap(control.map); 
+            this.setMap(control.map);
         }
 
         OpenLayers.Util.extend(this, options);
-        
+
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
-    
+
     /**
      * Method: setMap
      */
@@ -14210,7 +14210,7 @@
             (evt.shiftKey ? OpenLayers.Handler.MOD_SHIFT : 0) |
             (evt.ctrlKey  ? OpenLayers.Handler.MOD_CTRL  : 0) |
             (evt.altKey   ? OpenLayers.Handler.MOD_ALT   : 0);
-    
+
         /* if it differs from the handler object's key mask,
            bail out of the event handler */
         return (keyModifiers == this.keyMask);
@@ -14219,8 +14219,8 @@
     /**
      * APIMethod: activate
      * Turn on the handler.  Returns false if the handler was already active.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Boolean} The handler was activated.
      */
     activate: function() {
@@ -14231,17 +14231,17 @@
         var events = OpenLayers.Events.prototype.BROWSER_EVENTS;
         for (var i=0, len=events.length; i<len; i++) {
             if (this[events[i]]) {
-                this.register(events[i], this[events[i]]); 
+                this.register(events[i], this[events[i]]);
             }
-        } 
+        }
         this.active = true;
         return true;
     },
-    
+
     /**
      * APIMethod: deactivate
      * Turn off the handler.  Returns false if the handler was already inactive.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was deactivated.
      */
@@ -14253,9 +14253,9 @@
         var events = OpenLayers.Events.prototype.BROWSER_EVENTS;
         for (var i=0, len=events.length; i<len; i++) {
             if (this[events[i]]) {
-                this.unregister(events[i], this[events[i]]); 
+                this.unregister(events[i], this[events[i]]);
             }
-        } 
+        }
         this.active = false;
         return true;
     },
@@ -14267,7 +14267,7 @@
     * Parameters:
     * name - {String} The key for the callback that is one of the properties
     *     of the handler's callbacks object.
-    * args - {Array(*)} An array of arguments (any type) with which to call 
+    * args - {Array(*)} An array of arguments (any type) with which to call
     *     the callback (defined by the control).
     */
     callback: function (name, args) {
@@ -14291,10 +14291,10 @@
     * unregister an event from the map
     */
     unregister: function (name, method) {
-        this.map.events.unregister(name, this, method);   
+        this.map.events.unregister(name, this, method);
         this.map.events.unregister(name, this, this.setEvent);
     },
-    
+
     /**
      * Method: setEvent
      * With each registered browser event, the handler sets its own evt
@@ -14325,7 +14325,7 @@
         // unregister event listeners
         this.deactivate();
         // eliminate circular references
-        this.control = this.map = null;        
+        this.control = this.map = null;
     },
 
     CLASS_NAME: "OpenLayers.Handler"
@@ -14375,16 +14375,16 @@
  * Class: OpenLayers.Map
  * Instances of OpenLayers.Map are interactive maps embedded in a web page.
  * Create a new map with the <OpenLayers.Map> constructor.
- * 
+ *
  * On their own maps do not provide much functionality.  To extend a map
- * it's necessary to add controls (<OpenLayers.Control>) and 
- * layers (<OpenLayers.Layer>) to the map. 
+ * it's necessary to add controls (<OpenLayers.Control>) and
+ * layers (<OpenLayers.Layer>) to the map.
  */
 OpenLayers.Map = OpenLayers.Class({
-    
+
     /**
      * Constant: Z_INDEX_BASE
-     * {Object} Base z-indexes for different classes of thing 
+     * {Object} Base z-indexes for different classes of thing
      */
     Z_INDEX_BASE: {
         BaseLayer: 100,
@@ -14416,7 +14416,7 @@
      *
      * Supported map event types:
      *  - *preaddlayer* triggered before a layer has been added.  The event
-     *      object will include a *layer* property that references the layer  
+     *      object will include a *layer* property that references the layer
      *      to be added.
      *  - *addlayer* triggered after a layer has been added.  The event object
      *      will include a *layer* property that references the added layer.
@@ -14444,7 +14444,7 @@
      *  - *dragend* Does not work.  Register for moveend instead.
      *  - *changebaselayer* triggered after the base layer changes
      */
-    EVENT_TYPES: [ 
+    EVENT_TYPES: [
         "preaddlayer", "addlayer", "removelayer", "changelayer", "movestart",
         "move", "moveend", "zoomend", "popupopen", "popupclose",
         "addmarker", "removemarker", "clearmarkers", "mouseover",
@@ -14456,7 +14456,7 @@
      * {String} Unique identifier for the map
      */
     id: null,
-    
+
     /**
      * Property: fractionalZoom
      * {Boolean} For a base layer that supports it, allow the map resolution
@@ -14475,14 +14475,14 @@
      *     former works for non-integer zoom levels.
      */
     fractionalZoom: false,
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *                       events on the map
      */
     events: null,
-    
+
     /**
      * APIProperty: allOverlays
      * {Boolean} Allow the map to function with "overlays" only.  Defaults to
@@ -14509,13 +14509,13 @@
      *     div property may or may not be provided.  If the div property
      *     is not provided, the map can be rendered to a container later
      *     using the <render> method.
-     *     
+     *
      * Note: If you calling <render> after map construction, do not use
      *     <maxResolution>  auto.  Instead, divide your <maxExtent> by your
      *     maximum expected dimension.
      */
     div: null,
-    
+
     /**
      * Property: dragging
      * {Boolean} The map is currently being dragged.
@@ -14527,7 +14527,7 @@
      * {<OpenLayers.Size>} Size of the main div (this.div)
      */
     size: null,
-    
+
     /**
      * Property: viewPortDiv
      * {HTMLDivElement} The element that represents the map viewport
@@ -14578,7 +14578,7 @@
      * min/max zoom level, projection, etc.
      */
     baseLayer: null,
-    
+
     /**
      * Property: center
      * {<OpenLayers.LonLat>} The current center of the map
@@ -14595,25 +14595,25 @@
      * Property: zoom
      * {Integer} The current zoom level of the map
      */
-    zoom: 0,    
+    zoom: 0,
 
     /**
      * Property: panRatio
      * {Float} The ratio of the current extent within
      *         which panning will tween.
      */
-    panRatio: 1.5,    
+    panRatio: 1.5,
 
     /**
      * Property: viewRequestID
-     * {String} Used to store a unique identifier that changes when the map 
-     *          view changes. viewRequestID should be used when adding data 
-     *          asynchronously to the map: viewRequestID is incremented when 
-     *          you initiate your request (right now during changing of 
-     *          baselayers and changing of zooms). It is stored here in the 
-     *          map and also in the data that will be coming back 
-     *          asynchronously. Before displaying this data on request 
-     *          completion, we check that the viewRequestID of the data is 
+     * {String} Used to store a unique identifier that changes when the map
+     *          view changes. viewRequestID should be used when adding data
+     *          asynchronously to the map: viewRequestID is incremented when
+     *          you initiate your request (right now during changing of
+     *          baselayers and changing of zooms). It is stored here in the
+     *          map and also in the data that will be coming back
+     *          asynchronously. Before displaying this data on request
+     *          completion, we check that the viewRequestID of the data is
      *          still the same as that of the map. Fix for #480
      */
     viewRequestID: 0,
@@ -14629,12 +14629,12 @@
 
     /**
      * APIProperty: projection
-     * {String} Set in the map options to override the default projection 
-     *          string this map - also set maxExtent, maxResolution, and 
+     * {String} Set in the map options to override the default projection
+     *          string this map - also set maxExtent, maxResolution, and
      *          units if appropriate.  Default is "EPSG:4326".
      */
-    projection: "EPSG:4326",    
-        
+    projection: "EPSG:4326",
+
     /**
      * APIProperty: units
      * {String} The map units.  Defaults to 'degrees'.  Possible values are
@@ -14644,9 +14644,9 @@
 
     /**
      * APIProperty: resolutions
-     * {Array(Float)} A list of map resolutions (map units per pixel) in 
-     *     descending order.  If this is not set in the layer constructor, it 
-     *     will be set based on other resolution related properties 
+     * {Array(Float)} A list of map resolutions (map units per pixel) in
+     *     descending order.  If this is not set in the layer constructor, it
+     *     will be set based on other resolution related properties
      *     (maxExtent, maxResolution, maxScale, etc.).
      */
     resolutions: null,
@@ -14654,8 +14654,8 @@
     /**
      * APIProperty: maxResolution
      * {Float} Default max is 360 deg / 256 px, which corresponds to
-     *          zoom level 0 on gmaps.  Specify a different value in the map 
-     *          options if you are not using a geographic projection and 
+     *          zoom level 0 on gmaps.  Specify a different value in the map
+     *          options if you are not using a geographic projection and
      *          displaying the whole world.
      */
     maxResolution: 1.40625,
@@ -14681,20 +14681,20 @@
     /**
      * APIProperty: maxExtent
      * {<OpenLayers.Bounds>} The maximum extent for the map.  Defaults to the
-     *                       whole world in decimal degrees 
+     *                       whole world in decimal degrees
      *                       (-180, -90, 180, 90).  Specify a different
-     *                        extent in the map options if you are not using a 
-     *                        geographic projection and displaying the whole 
+     *                        extent in the map options if you are not using a
+     *                        geographic projection and displaying the whole
      *                        world.
      */
     maxExtent: null,
-    
+
     /**
      * APIProperty: minExtent
      * {<OpenLayers.Bounds>}
      */
     minExtent: null,
-    
+
     /**
      * APIProperty: restrictedExtent
      * {<OpenLayers.Bounds>} Limit map navigation to this extent where possible.
@@ -14716,18 +14716,18 @@
     /**
      * APIProperty: theme
      * {String} Relative path to a CSS file from which to load theme styles.
-     *          Specify null in the map options (e.g. {theme: null}) if you 
-     *          want to get cascading style declarations - by putting links to 
+     *          Specify null in the map options (e.g. {theme: null}) if you
+     *          want to get cascading style declarations - by putting links to
      *          stylesheets or style declarations directly in your page.
      */
     theme: null,
-    
-    /** 
+
+    /**
      * APIProperty: displayProjection
      * {<OpenLayers.Projection>} Requires proj4js support.Projection used by
      *     several controls to display data to user. If this property is set,
      *     it will be set on any control which has a null displayProjection
-     *     property at the time the control is added to the map. 
+     *     property at the time the control is added to the map.
      */
     displayProjection: null,
 
@@ -14738,7 +14738,7 @@
      *           Default is to fall through.
      */
     fallThrough: true,
-    
+
     /**
      * Property: panTween
      * {OpenLayers.Tween} Animated panning tween object, see panTo()
@@ -14761,7 +14761,7 @@
      * animated panning.
      */
     panMethod: OpenLayers.Easing.Expo.easeOut,
-    
+
     /**
      * Property: panDuration
      * {Integer} The number of steps to be passed to the
@@ -14770,14 +14770,14 @@
      * Default is 50.
      */
     panDuration: 50,
-    
+
     /**
      * Property: paddingForPopups
-     * {<OpenLayers.Bounds>} Outside margin of the popup. Used to prevent 
+     * {<OpenLayers.Bounds>} Outside margin of the popup. Used to prevent
      *     the popup from getting too close to the map border.
      */
     paddingForPopups : null,
-    
+
     /**
      * Constructor: OpenLayers.Map
      * Constructor for a new OpenLayers.Map instance.  There are two possible
@@ -14822,28 +14822,28 @@
      *     units: 'm',
      *     projection: "EPSG:41001"
      * });
-     */    
+     */
     initialize: function (div, options) {
-        
+
         // If only one argument is provided, check if it is an object.
         if(arguments.length === 1 && typeof div === "object") {
             options = div;
             div = options && options.div;
         }
 
-        // Simple-type defaults are set in class definition. 
-        //  Now set complex-type defaults 
+        // Simple-type defaults are set in class definition.
+        //  Now set complex-type defaults
         this.tileSize = new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,
                                             OpenLayers.Map.TILE_HEIGHT);
-        
+
         this.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90);
-        
+
         this.paddingForPopups = new OpenLayers.Bounds(15, 15, 15, 15);
 
-        this.theme = OpenLayers._getScriptLocation() + 
-                             'theme/default/style.css'; 
+        this.theme = OpenLayers._getScriptLocation() +
+                             'theme/default/style.css';
 
-        // now override default options 
+        // now override default options
         OpenLayers.Util.extend(this, options);
 
         this.id = OpenLayers.Util.createUniqueID("OpenLayers.Map_");
@@ -14854,7 +14854,7 @@
             this.div.style.height = "1px";
             this.div.style.width = "1px";
         }
-        
+
         OpenLayers.Element.addClass(this.div, 'olMap');
 
         // the viewPortDiv is the outermost div we modify
@@ -14871,37 +14871,37 @@
         id = this.div.id + "_OpenLayers_Container";
         this.layerContainerDiv = OpenLayers.Util.createDiv(id);
         this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;
-        
+
         this.viewPortDiv.appendChild(this.layerContainerDiv);
 
-        this.events = new OpenLayers.Events(this, 
-                                            this.div, 
-                                            this.EVENT_TYPES, 
-                                            this.fallThrough, 
+        this.events = new OpenLayers.Events(this,
+                                            this.div,
+                                            this.EVENT_TYPES,
+                                            this.fallThrough,
                                             {includeXY: true});
         this.updateSize();
         if(this.eventListeners instanceof Object) {
             this.events.on(this.eventListeners);
         }
- 
+
         // update the map size and location before the map moves
         this.events.register("movestart", this, this.updateSize);
 
-        // Because Mozilla does not support the "resize" event for elements 
-        // other than "window", we need to put a hack here. 
+        // Because Mozilla does not support the "resize" event for elements
+        // other than "window", we need to put a hack here.
         if (OpenLayers.String.contains(navigator.appName, "Microsoft")) {
             // If IE, register the resize on the div
             this.events.register("resize", this, this.updateSize);
         } else {
             // Else updateSize on catching the window's resize
-            //  Note that this is ok, as updateSize() does nothing if the 
+            //  Note that this is ok, as updateSize() does nothing if the
             //  map's size has not actually changed.
-            this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize, 
+            this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize,
                 this);
             OpenLayers.Event.observe(window, 'resize',
                             this.updateSizeDestroy);
         }
-        
+
         // only append link stylesheet if the theme property is set
         if(this.theme) {
             // check existing links for equivalent url
@@ -14926,7 +14926,7 @@
         }
 
         this.layers = [];
-        
+
         if (this.controls == null) {
             if (OpenLayers.Control != null) { // running full or lite?
                 this.controls = [ new OpenLayers.Control.Navigation(),
@@ -14946,16 +14946,16 @@
         this.popups = [];
 
         this.unloadDestroy = OpenLayers.Function.bind(this.destroy, this);
-        
 
+
         // always call map.destroy()
         OpenLayers.Event.observe(window, 'unload', this.unloadDestroy);
     },
-    
+
     /**
      * APIMethod: render
      * Render the map to a specified container.
-     * 
+     *
      * Parameters:
      * div - {String|DOMElement} The container that the map should be rendered
      *     to. If different than the current container, the map viewport
@@ -14976,11 +14976,11 @@
      *     so that if map is manually destroyed, we can unregister this.
      */
     unloadDestroy: null,
-    
+
     /**
      * Method: updateSizeDestroy
      * When the map is destroyed, we need to stop listening to updateSize
-     *    events: this method stores the function we need to unregister in 
+     *    events: this method stores the function we need to unregister in
      *    non-IE browsers.
      */
     updateSizeDestroy: null,
@@ -15000,26 +15000,26 @@
         this.unloadDestroy = null;
 
         if (this.updateSizeDestroy) {
-            OpenLayers.Event.stopObserving(window, 'resize', 
+            OpenLayers.Event.stopObserving(window, 'resize',
                                            this.updateSizeDestroy);
         } else {
             this.events.unregister("resize", this, this.updateSize);
-        }    
-        
-        this.paddingForPopups = null;    
+        }
 
+        this.paddingForPopups = null;
+
         if (this.controls != null) {
             for (var i = this.controls.length - 1; i>=0; --i) {
                 this.controls[i].destroy();
-            } 
+            }
             this.controls = null;
         }
         if (this.layers != null) {
             for (var i = this.layers.length - 1; i>=0; --i) {
-                //pass 'false' to destroy so that map wont try to set a new 
+                //pass 'false' to destroy so that map wont try to set a new
                 // baselayer after each baselayer is removed
                 this.layers[i].destroy(false);
-            } 
+            }
             this.layers = null;
         }
         if (this.viewPortDiv) {
@@ -15194,7 +15194,7 @@
   /*     The following functions deal with adding and     */
   /*        removing Layers to and from the Map           */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
     /**
      * APIMethod: getLayer
@@ -15204,7 +15204,7 @@
      * id - {String} A layer id
      *
      * Returns:
-     * {<OpenLayers.Layer>} The Layer with the corresponding id from the map's 
+     * {<OpenLayers.Layer>} The Layer with the corresponding id from the map's
      *                      layer collection, or null if not found.
      */
     getLayer: function(id) {
@@ -15221,11 +15221,11 @@
 
     /**
     * Method: setLayerZIndex
-    * 
+    *
     * Parameters:
-    * layer - {<OpenLayers.Layer>} 
-    * zIdx - {int} 
-    */    
+    * layer - {<OpenLayers.Layer>}
+    * zIdx - {int}
+    */
     setLayerZIndex: function (layer, zIdx) {
         layer.setZIndex(
             this.Z_INDEX_BASE[layer.isBaseLayer ? 'BaseLayer' : 'Overlay']
@@ -15247,12 +15247,12 @@
     * APIMethod: addLayer
     *
     * Parameters:
-    * layer - {<OpenLayers.Layer>} 
-    */    
+    * layer - {<OpenLayers.Layer>}
+    */
     addLayer: function (layer) {
         for(var i=0, len=this.layers.length; i <len; i++) {
             if (this.layers[i] == layer) {
-                var msg = OpenLayers.i18n('layerAlreadyAdded', 
+                var msg = OpenLayers.i18n('layerAlreadyAdded',
                                                       {'layerName':layer.name});
                 OpenLayers.Console.warn(msg);
                 return false;
@@ -15263,7 +15263,7 @@
         }
 
         this.events.triggerEvent("preaddlayer", {layer: layer});
-        
+
         layer.div.className = "olLayerDiv";
         layer.div.style.overflow = "";
         this.setLayerZIndex(layer, this.layers.length);
@@ -15292,43 +15292,43 @@
     },
 
     /**
-    * APIMethod: addLayers 
+    * APIMethod: addLayers
     *
     * Parameters:
-    * layers - {Array(<OpenLayers.Layer>)} 
-    */    
+    * layers - {Array(<OpenLayers.Layer>)}
+    */
     addLayers: function (layers) {
         for (var i=0, len=layers.length; i<len; i++) {
             this.addLayer(layers[i]);
         }
     },
 
-    /** 
+    /**
      * APIMethod: removeLayer
-     * Removes a layer from the map by removing its visual element (the 
-     *   layer.div property), then removing it from the map's internal list 
-     *   of layers, setting the layer's map property to null. 
-     * 
+     * Removes a layer from the map by removing its visual element (the
+     *   layer.div property), then removing it from the map's internal list
+     *   of layers, setting the layer's map property to null.
+     *
      *   a "removelayer" event is triggered.
-     * 
+     *
      *   very worthy of mention is that simply removing a layer from a map
      *   will not cause the removal of any popups which may have been created
      *   by the layer. this is due to the fact that it was decided at some
-     *   point that popups would not belong to layers. thus there is no way 
+     *   point that popups would not belong to layers. thus there is no way
      *   for us to know here to which layer the popup belongs.
-     *    
+     *
      *     A simple solution to this is simply to call destroy() on the layer.
      *     the default OpenLayers.Layer class's destroy() function
      *     automatically takes care to remove itself from whatever map it has
-     *     been attached to. 
-     * 
-     *     The correct solution is for the layer itself to register an 
-     *     event-handler on "removelayer" and when it is called, if it 
+     *     been attached to.
+     *
+     *     The correct solution is for the layer itself to register an
+     *     event-handler on "removelayer" and when it is called, if it
      *     recognizes itself as the layer being removed, then it cycles through
      *     its own personal list of popups, removing them from the map.
-     * 
+     *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
+     * layer - {<OpenLayers.Layer>}
      * setNewBaseLayer - {Boolean} Default is true
      */
     removeLayer: function(layer, setNewBaseLayer) {
@@ -15366,7 +15366,7 @@
 
     /**
      * APIMethod: getNumLayers
-     * 
+     *
      * Returns:
      * {Int} The number of layers attached to the map.
      */
@@ -15374,7 +15374,7 @@
         return this.layers.length;
     },
 
-    /** 
+    /**
      * APIMethod: getLayerIndex
      *
      * Parameters:
@@ -15387,8 +15387,8 @@
     getLayerIndex: function (layer) {
         return OpenLayers.Util.indexOf(this.layers, layer);
     },
-    
-    /** 
+
+    /**
      * APIMethod: setLayerIndex
      * Move the given layer to the specified (zero-based) index in the layer
      *     list, changing its z-index in the map display. Use
@@ -15397,8 +15397,8 @@
      *     raise base layers above overlays.
      *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
-     * idx - {int} 
+     * layer - {<OpenLayers.Layer>}
+     * idx - {int}
      */
     setLayerIndex: function (layer, idx) {
         var base = this.getLayerIndex(layer);
@@ -15426,27 +15426,27 @@
         }
     },
 
-    /** 
+    /**
      * APIMethod: raiseLayer
-     * Change the index of the given layer by delta. If delta is positive, 
+     * Change the index of the given layer by delta. If delta is positive,
      *     the layer is moved up the map's layer stack; if delta is negative,
      *     the layer is moved down.  Again, note that this cannot (or at least
      *     should not) be effectively used to raise base layers above overlays.
      *
      * Paremeters:
-     * layer - {<OpenLayers.Layer>} 
-     * delta - {int} 
+     * layer - {<OpenLayers.Layer>}
+     * delta - {int}
      */
     raiseLayer: function (layer, delta) {
         var idx = this.getLayerIndex(layer) + delta;
         this.setLayerIndex(layer, idx);
     },
-    
-    /** 
+
+    /**
      * APIMethod: setBaseLayer
      * Allows user to specify one of the currently-loaded layers as the Map's
      *     new base layer.
-     * 
+     *
      * Parameters:
      * newBaseLayer - {<OpenLayers.Layer>}
      */
@@ -15457,20 +15457,20 @@
         }
 
         if (newBaseLayer != this.baseLayer) {
-          
+
             // is newBaseLayer an already loaded layer?m
             if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
 
-                // make the old base layer invisible 
+                // make the old base layer invisible
                 if (this.baseLayer != null && !this.allOverlays) {
                     this.baseLayer.setVisibility(false);
                 }
 
                 // set new baselayer
                 this.baseLayer = newBaseLayer;
-                
-                // Increment viewRequestID since the baseLayer is 
-                // changing. This is used by tiles to check if they should 
+
+                // Increment viewRequestID since the baseLayer is
+                // changing. This is used by tiles to check if they should
                 // draw themselves.
                 this.viewRequestID++;
                 if(!this.allOverlays) {
@@ -15482,14 +15482,14 @@
                 if (center != null) {
 
                     //either get the center from the old Extent or just from
-                    // the current center of the map. 
-                    var newCenter = (oldExtent) 
+                    // the current center of the map.
+                    var newCenter = (oldExtent)
                         ? oldExtent.getCenterLonLat()
                         : center;
 
-                    //the new zoom will either come from the old Extent or 
-                    // from the current resolution of the map                                                
-                    var newZoom = (oldExtent) 
+                    //the new zoom will either come from the old Extent or
+                    // from the current resolution of the map
+                    var newZoom = (oldExtent)
                         ? this.getZoomForExtent(oldExtent, true)
                         : this.getZoomForResolution(this.resolution, true);
 
@@ -15500,7 +15500,7 @@
                 this.events.triggerEvent("changebaselayer", {
                     layer: this.baseLayer
                 });
-            }        
+            }
         }
     },
 
@@ -15512,15 +15512,15 @@
   /*     The following functions deal with adding and     */
   /*        removing Controls to and from the Map         */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
     /**
      * APIMethod: addControl
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>}
      * px - {<OpenLayers.Pixel>}
-     */    
+     */
     addControl: function (control, px) {
         this.controls.push(control);
         this.addControlToMap(control, px);
@@ -15528,23 +15528,23 @@
 
     /**
      * Method: addControlToMap
-     * 
+     *
      * Parameters:
-     * 
+     *
      * control - {<OpenLayers.Control>}
      * px - {<OpenLayers.Pixel>}
-     */    
+     */
     addControlToMap: function (control, px) {
         // If a control doesn't have a div at this point, it belongs in the
         // viewport.
         control.outsideViewport = (control.div != null);
-        
-        // If the map has a displayProjection, and the control doesn't, set 
+
+        // If the map has a displayProjection, and the control doesn't, set
         // the display projection.
         if (this.displayProjection && !control.displayProjection) {
             control.displayProjection = this.displayProjection;
-        }    
-        
+        }
+
         control.setMap(this);
         var div = control.draw(px);
         if (div) {
@@ -15555,18 +15555,18 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: getControl
-     * 
+     *
      * Parameters:
      * id - {String} ID of the control to return.
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Control>} The control from the map's list of controls 
-     *                        which has a matching 'id'. If none found, 
+     * {<OpenLayers.Control>} The control from the map's list of controls
+     *                        which has a matching 'id'. If none found,
      *                        returns null.
-     */    
+     */
     getControl: function (id) {
         var returnControl = null;
         for(var i=0, len=this.controls.length; i<len; i++) {
@@ -15578,16 +15578,16 @@
         }
         return returnControl;
     },
-    
-    /** 
+
+    /**
      * APIMethod: removeControl
-     * Remove a control from the map. Removes the control both from the map 
-     *     object's internal array of controls, as well as from the map's 
+     * Remove a control from the map. Removes the control both from the map
+     *     object's internal array of controls, as well as from the map's
      *     viewPort (assuming the control was not added outsideViewport)
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control to remove.
-     */    
+     */
     removeControl: function (control) {
         //make sure control is non-null and actually part of our map
         if ( (control) && (control == this.getControl(control.id)) ) {
@@ -15605,11 +15605,11 @@
   /*     The following functions deal with adding and     */
   /*        removing Popups to and from the Map           */
   /*                                                      */
-  /********************************************************/         
+  /********************************************************/
 
-    /** 
+    /**
      * APIMethod: addPopup
-     * 
+     *
      * Parameters:
      * popup - {<OpenLayers.Popup>}
      * exclusive - {Boolean} If true, closes all other popups first
@@ -15632,10 +15632,10 @@
             this.layerContainerDiv.appendChild(popupDiv);
         }
     },
-    
-    /** 
+
+    /**
     * APIMethod: removePopup
-    * 
+    *
     * Parameters:
     * popup - {<OpenLayers.Popup>}
     */
@@ -15656,15 +15656,15 @@
   /*   The following functions deal with the access to    */
   /*    and maintenance of the size of the container div  */
   /*                                                      */
-  /********************************************************/     
+  /********************************************************/
 
     /**
      * APIMethod: getSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} An <OpenLayers.Size> object that represents the 
-     *                     size, in pixels, of the div into which OpenLayers 
-     *                     has been loaded. 
+     * {<OpenLayers.Size>} An <OpenLayers.Size> object that represents the
+     *                     size, in pixels, of the div into which OpenLayers
+     *                     has been loaded.
      *                     Note - A clone() of this locally cached variable is
      *                     returned, so as not to allow users to modify it.
      */
@@ -15679,7 +15679,7 @@
     /**
      * APIMethod: updateSize
      * This function should be called by any external code which dynamically
-     *     changes the size of the map div (because mozilla wont let us catch 
+     *     changes the size of the map div (because mozilla wont let us catch
      *     the "onresize" for an element)
      */
     updateSize: function() {
@@ -15691,13 +15691,13 @@
             this.size = oldSize = newSize;
         }
         if (!newSize.equals(oldSize)) {
-            
+
             // store the new size
             this.size = newSize;
 
             //notify layers of mapresize
             for(var i=0, len=this.layers.length; i<len; i++) {
-                this.layers[i].onMapResize();                
+                this.layers[i].onMapResize();
             }
 
             if (this.baseLayer != null) {
@@ -15710,17 +15710,17 @@
 
         }
     },
-    
+
     /**
      * Method: getCurrentSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} A new <OpenLayers.Size> object with the dimensions 
+     * {<OpenLayers.Size>} A new <OpenLayers.Size> object with the dimensions
      *                     of the map div
      */
     getCurrentSize: function() {
 
-        var size = new OpenLayers.Size(this.div.clientWidth, 
+        var size = new OpenLayers.Size(this.div.clientWidth,
                                        this.div.clientHeight);
 
         // Workaround for the fact that hidden elements return 0 for size.
@@ -15736,39 +15736,39 @@
         return size;
     },
 
-    /** 
+    /**
      * Method: calculateBounds
-     * 
+     *
      * Parameters:
      * center - {<OpenLayers.LonLat>} Default is this.getCenter()
-     * resolution - {float} Default is this.getResolution() 
-     * 
+     * resolution - {float} Default is this.getResolution()
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A bounds based on resolution, center, and 
+     * {<OpenLayers.Bounds>} A bounds based on resolution, center, and
      *                       current mapsize.
      */
     calculateBounds: function(center, resolution) {
 
         var extent = null;
-        
+
         if (center == null) {
             center = this.getCenter();
-        }                
+        }
         if (resolution == null) {
             resolution = this.getResolution();
         }
-    
+
         if ((center != null) && (resolution != null)) {
 
             var size = this.getSize();
             var w_deg = size.w * resolution;
             var h_deg = size.h * resolution;
-        
+
             extent = new OpenLayers.Bounds(center.lon - w_deg / 2,
                                            center.lat - h_deg / 2,
                                            center.lon + w_deg / 2,
                                            center.lat + h_deg / 2);
-        
+
         }
 
         return extent;
@@ -15786,7 +15786,7 @@
   /********************************************************/
     /**
      * APIMethod: getCenter
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>}
      */
@@ -15801,18 +15801,18 @@
 
     /**
      * APIMethod: getZoom
-     * 
+     *
      * Returns:
      * {Integer}
      */
     getZoom: function () {
         return this.zoom;
     },
-    
-    /** 
+
+    /**
      * APIMethod: pan
      * Allows user to pan by a value of screen pixels
-     * 
+     *
      * Parameters:
      * dx - {Integer}
      * dy - {Integer}
@@ -15831,7 +15831,7 @@
 
         // adjust
         var newCenterPx = centerPx.add(dx, dy);
-        
+
         // only call setCenter if not dragging or there has been a change
         if (!options.dragging || !newCenterPx.equals(centerPx)) {
             var newCenterLonLat = this.getLonLatFromViewPortPx(newCenterPx);
@@ -15839,16 +15839,16 @@
                 this.panTo(newCenterLonLat);
             } else {
                 this.setCenter(newCenterLonLat, null, options.dragging);
-            }    
+            }
         }
 
    },
-   
-   /** 
+
+   /**
      * APIMethod: panTo
      * Allows user to pan to a new lonlat
      * If the new lonlat is in the current extent the map will slide smoothly
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.Lonlat>}
      */
@@ -15902,13 +15902,13 @@
     /**
      * APIMethod: setCenter
      * Set the map center (and optionally, the zoom level).
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} The new center location.
      * zoom - {Integer} Optional zoom level.
-     * dragging - {Boolean} Specifies whether or not to trigger 
+     * dragging - {Boolean} Specifies whether or not to trigger
      *                      movestart/end events
-     * forceZoomChange - {Boolean} Specifies whether or not to trigger zoom 
+     * forceZoomChange - {Boolean} Specifies whether or not to trigger zoom
      *                             change events (needed on baseLayer change)
      *
      * TBD: reconsider forceZoomChange in 3.0
@@ -15930,9 +15930,9 @@
      * options - {Object}
      */
     moveTo: function(lonlat, zoom, options) {
-        if (!options) { 
+        if (!options) {
             options = {};
-        }    
+        }
         // dragging is false by default
         var dragging = options.dragging;
         // forceZoomChange is false by default
@@ -15942,51 +15942,51 @@
 
         if (this.panTween && options.caller == "setCenter") {
             this.panTween.stop();
-        }    
-             
+        }
+
         if (!this.center && !this.isValidLonLat(lonlat)) {
             lonlat = this.maxExtent.getCenterLonLat();
         }
 
         if(this.restrictedExtent != null) {
             // In 3.0, decide if we want to change interpretation of maxExtent.
-            if(lonlat == null) { 
-                lonlat = this.getCenter(); 
+            if(lonlat == null) {
+                lonlat = this.getCenter();
             }
-            if(zoom == null) { 
-                zoom = this.getZoom(); 
+            if(zoom == null) {
+                zoom = this.getZoom();
             }
             var resolution = this.getResolutionForZoom(zoom);
-            var extent = this.calculateBounds(lonlat, resolution); 
+            var extent = this.calculateBounds(lonlat, resolution);
             if(!this.restrictedExtent.containsBounds(extent)) {
-                var maxCenter = this.restrictedExtent.getCenterLonLat(); 
-                if(extent.getWidth() > this.restrictedExtent.getWidth()) { 
-                    lonlat = new OpenLayers.LonLat(maxCenter.lon, lonlat.lat); 
+                var maxCenter = this.restrictedExtent.getCenterLonLat();
+                if(extent.getWidth() > this.restrictedExtent.getWidth()) {
+                    lonlat = new OpenLayers.LonLat(maxCenter.lon, lonlat.lat);
                 } else if(extent.left < this.restrictedExtent.left) {
                     lonlat = lonlat.add(this.restrictedExtent.left -
-                                        extent.left, 0); 
-                } else if(extent.right > this.restrictedExtent.right) { 
+                                        extent.left, 0);
+                } else if(extent.right > this.restrictedExtent.right) {
                     lonlat = lonlat.add(this.restrictedExtent.right -
-                                        extent.right, 0); 
-                } 
-                if(extent.getHeight() > this.restrictedExtent.getHeight()) { 
-                    lonlat = new OpenLayers.LonLat(lonlat.lon, maxCenter.lat); 
-                } else if(extent.bottom < this.restrictedExtent.bottom) { 
+                                        extent.right, 0);
+                }
+                if(extent.getHeight() > this.restrictedExtent.getHeight()) {
+                    lonlat = new OpenLayers.LonLat(lonlat.lon, maxCenter.lat);
+                } else if(extent.bottom < this.restrictedExtent.bottom) {
                     lonlat = lonlat.add(0, this.restrictedExtent.bottom -
-                                        extent.bottom); 
-                } 
-                else if(extent.top > this.restrictedExtent.top) { 
+                                        extent.bottom);
+                }
+                else if(extent.top > this.restrictedExtent.top) {
                     lonlat = lonlat.add(0, this.restrictedExtent.top -
-                                        extent.top); 
-                } 
+                                        extent.top);
+                }
             }
         }
-        
+
         var zoomChanged = forceZoomChange || (
-                            (this.isValidZoomLevel(zoom)) && 
+                            (this.isValidZoomLevel(zoom)) &&
                             (zoom != this.getZoom()) );
 
-        var centerChanged = (this.isValidLonLat(lonlat)) && 
+        var centerChanged = (this.isValidLonLat(lonlat)) &&
                             (!lonlat.equals(this.center));
 
 
@@ -15998,7 +15998,7 @@
             }
 
             if (centerChanged) {
-                if ((!zoomChanged) && (this.center)) { 
+                if ((!zoomChanged) && (this.center)) {
                     // if zoom hasnt changed, just slide layerContainer
                     //  (must be done before setting this.center to new value)
                     this.centerLayerContainer(lonlat);
@@ -16018,12 +16018,12 @@
                 this.resolution = this.getResolutionForZoom(zoom);
                 // zoom level has changed, increment viewRequestID.
                 this.viewRequestID++;
-            }    
-            
+            }
+
             var bounds = this.getExtent();
-            
-            //send the move call to the baselayer and all the overlays    
 
+            //send the move call to the baselayer and all the overlays
+
             if(this.baseLayer.visibility) {
                 this.baseLayer.moveTo(bounds, zoomChanged, dragging);
                 if(dragging) {
@@ -16034,9 +16034,9 @@
                     );
                 }
             }
-            
+
             bounds = this.baseLayer.getExtent();
-            
+
             for (var i=0, len=this.layers.length; i<len; i++) {
                 var layer = this.layers[i];
                 if (layer !== this.baseLayer && !layer.isBaseLayer) {
@@ -16064,18 +16064,18 @@
                             );
                         }
                     }
-                }                
+                }
             }
-            
+
             if (zoomChanged) {
                 //redraw popups
                 for (var i=0, len=this.popups.length; i<len; i++) {
                     this.popups[i].updatePosition();
                 }
-            }    
-            
+            }
+
             this.events.triggerEvent("move");
-    
+
             if (zoomChanged) { this.events.triggerEvent("zoomend"); }
         }
 
@@ -16083,16 +16083,16 @@
         if (!dragging && !noEvent) {
             this.events.triggerEvent("moveend");
         }
-        
+
         // Store the map dragging state for later use
-        this.dragging = !!dragging; 
+        this.dragging = !!dragging;
 
     },
 
-    /** 
+    /**
      * Method: centerLayerContainer
      * This function takes care to recenter the layerContainerDiv.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
      */
@@ -16109,26 +16109,26 @@
 
     /**
      * Method: isValidZoomLevel
-     * 
+     *
      * Parameters:
      * zoomLevel - {Integer}
-     * 
+     *
      * Returns:
-     * {Boolean} Whether or not the zoom level passed in is non-null and 
+     * {Boolean} Whether or not the zoom level passed in is non-null and
      *           within the min/max range of zoom levels.
      */
     isValidZoomLevel: function(zoomLevel) {
        return ( (zoomLevel != null) &&
-                (zoomLevel >= 0) && 
+                (zoomLevel >= 0) &&
                 (zoomLevel < this.getNumZoomLevels()) );
     },
-    
+
     /**
      * Method: isValidLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the lonlat passed in is non-null and within
      *           the maxExtent bounds
@@ -16137,7 +16137,7 @@
         var valid = false;
         if (lonlat != null) {
             var maxExtent = this.getMaxExtent();
-            valid = maxExtent.containsLonLat(lonlat);        
+            valid = maxExtent.containsLonLat(lonlat);
         }
         return valid;
     },
@@ -16149,25 +16149,25 @@
   /*    Accessor functions to Layer Options parameters    */
   /*                                                      */
   /********************************************************/
-    
+
     /**
      * APIMethod: getProjection
-     * This method returns a string representing the projection. In 
+     * This method returns a string representing the projection. In
      *     the case of projection support, this will be the srsCode which
      *     is loaded -- otherwise it will simply be the string value that
      *     was passed to the projection at startup.
      *
      * FIXME: In 3.0, we will remove getProjectionObject, and instead
-     *     return a Projection object from this function. 
-     * 
+     *     return a Projection object from this function.
+     *
      * Returns:
-     * {String} The Projection string from the base layer or null. 
+     * {String} The Projection string from the base layer or null.
      */
     getProjection: function() {
         var projection = this.getProjectionObject();
         return projection ? projection.getCode() : null;
     },
-    
+
     /**
      * APIMethod: getProjectionObject
      * Returns the projection obect from the baselayer.
@@ -16182,10 +16182,10 @@
         }
         return projection;
     },
-    
+
     /**
      * APIMethod: getMaxResolution
-     * 
+     *
      * Returns:
      * {String} The Map's Maximum Resolution
      */
@@ -16196,19 +16196,19 @@
         }
         return maxResolution;
     },
-        
+
     /**
      * APIMethod: getMaxExtent
      *
      * Parameters:
-     * options - {Object} 
-     * 
+     * options - {Object}
+     *
      * Allowed Options:
-     * restricted - {Boolean} If true, returns restricted extent (if it is 
+     * restricted - {Boolean} If true, returns restricted extent (if it is
      *     available.)
      *
      * Returns:
-     * {<OpenLayers.Bounds>} The maxExtent property as set on the current 
+     * {<OpenLayers.Bounds>} The maxExtent property as set on the current
      *     baselayer, unless the 'restricted' option is set, in which case
      *     the 'restrictedExtent' option from the map is returned (if it
      *     is set).
@@ -16219,15 +16219,15 @@
             maxExtent = this.restrictedExtent;
         } else if (this.baseLayer != null) {
             maxExtent = this.baseLayer.maxExtent;
-        }        
+        }
         return maxExtent;
     },
-    
+
     /**
      * APIMethod: getNumZoomLevels
-     * 
+     *
      * Returns:
-     * {Integer} The total number of zoom levels that can be displayed by the 
+     * {Integer} The total number of zoom levels that can be displayed by the
      *           current baseLayer.
      */
     getNumZoomLevels: function() {
@@ -16251,10 +16251,10 @@
 
     /**
      * APIMethod: getExtent
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
-     *                       bounds of the current viewPort. 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
+     *                       bounds of the current viewPort.
      *                       If no baselayer is set, returns null.
      */
     getExtent: function () {
@@ -16267,9 +16267,9 @@
 
     /**
      * APIMethod: getResolution
-     * 
+     *
      * Returns:
-     * {Float} The current resolution of the map. 
+     * {Float} The current resolution of the map.
      *         If no baselayer is set, returns null.
      */
     getResolution: function () {
@@ -16282,9 +16282,9 @@
 
     /**
      * APIMethod: getUnits
-     * 
+     *
      * Returns:
-     * {Float} The current units of the map. 
+     * {Float} The current units of the map.
      *         If no baselayer is set, returns null.
      */
     getUnits: function () {
@@ -16297,9 +16297,9 @@
 
      /**
       * APIMethod: getScale
-      * 
+      *
       * Returns:
-      * {Float} The current scale denominator of the map. 
+      * {Float} The current scale denominator of the map.
       *         If no baselayer is set, returns null.
       */
     getScale: function () {
@@ -16315,14 +16315,14 @@
 
     /**
      * APIMethod: getZoomForExtent
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      * Returns:
      * {Integer} A suitable zoom level for the specified bounds.
      *           If no baselayer is set, returns null.
@@ -16337,10 +16337,10 @@
 
     /**
      * APIMethod: getResolutionForZoom
-     * 
+     *
      * Parameter:
      * zoom - {Float}
-     * 
+     *
      * Returns:
      * {Float} A suitable resolution for the specified zoom.  If no baselayer
      *     is set, returns null.
@@ -16355,17 +16355,17 @@
 
     /**
      * APIMethod: getZoomForResolution
-     * 
+     *
      * Parameter:
      * resolution - {Float}
-     * closest - {Boolean} Find the zoom level that corresponds to the absolute 
+     * closest - {Boolean} Find the zoom level that corresponds to the absolute
      *     closest resolution, which may result in a zoom whose corresponding
      *     resolution is actually smaller than we would have desired (if this
      *     is being called from a getZoomForExtent() call, then this means that
-     *     the returned zoom index might not actually contain the entire 
+     *     the returned zoom index might not actually contain the entire
      *     extent specified... but it'll be close).
      *     Default is false.
-     * 
+     *
      * Returns:
      * {Integer} A suitable zoom level for the specified resolution.
      *           If no baselayer is set, returns null.
@@ -16387,11 +16387,11 @@
   /*               the setCenter() function               */
   /*                                                      */
   /********************************************************/
-  
-    /** 
+
+    /**
      * APIMethod: zoomTo
      * Zoom to a specific zoom level
-     * 
+     *
      * Parameters:
      * zoom - {Integer}
      */
@@ -16400,20 +16400,20 @@
             this.setCenter(null, zoom);
         }
     },
-    
+
     /**
      * APIMethod: zoomIn
-     * 
+     *
      * Parameters:
      * zoom - {int}
      */
     zoomIn: function() {
         this.zoomTo(this.getZoom() + 1);
     },
-    
+
     /**
      * APIMethod: zoomOut
-     * 
+     *
      * Parameters:
      * zoom - {int}
      */
@@ -16424,35 +16424,35 @@
     /**
      * APIMethod: zoomToExtent
      * Zoom to the passed in bounds, recenter
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      */
     zoomToExtent: function(bounds, closest) {
         var center = bounds.getCenterLonLat();
         if (this.baseLayer.wrapDateLine) {
             var maxExtent = this.getMaxExtent();
 
-            //fix straddling bounds (in the case of a bbox that straddles the 
-            // dateline, it's left and right boundaries will appear backwards. 
+            //fix straddling bounds (in the case of a bbox that straddles the
+            // dateline, it's left and right boundaries will appear backwards.
             // we fix this by allowing a right value that is greater than the
-            // max value at the dateline -- this allows us to pass a valid 
+            // max value at the dateline -- this allows us to pass a valid
             // bounds to calculate zoom)
             //
             bounds = bounds.clone();
             while (bounds.right < bounds.left) {
                 bounds.right += maxExtent.getWidth();
             }
-            //if the bounds was straddling (see above), then the center point 
+            //if the bounds was straddling (see above), then the center point
             // we got from it was wrong. So we take our new bounds and ask it
-            // for the center. Because our new bounds is at least partially 
-            // outside the bounds of maxExtent, the new calculated center 
-            // might also be. We don't want to pass a bad center value to 
+            // for the center. Because our new bounds is at least partially
+            // outside the bounds of maxExtent, the new calculated center
+            // might also be. We don't want to pass a bad center value to
             // setCenter, so we have it wrap itself across the date line.
             //
             center = bounds.getCenterLonLat().wrapDateLine(maxExtent);
@@ -16460,15 +16460,15 @@
         this.setCenter(center, this.getZoomForExtent(bounds, closest));
     },
 
-    /** 
+    /**
      * APIMethod: zoomToMaxExtent
      * Zoom to the full extent and recenter.
      *
      * Parameters:
-     * options - 
-     * 
+     * options -
+     *
      * Allowed Options:
-     * restricted - {Boolean} True to zoom to restricted extent if it is 
+     * restricted - {Boolean} True to zoom to restricted extent if it is
      *     set. Defaults to true.
      */
     zoomToMaxExtent: function(options) {
@@ -16476,25 +16476,25 @@
         var restricted = (options) ? options.restricted : true;
 
         var maxExtent = this.getMaxExtent({
-            'restricted': restricted 
+            'restricted': restricted
         });
         this.zoomToExtent(maxExtent);
     },
 
-    /** 
+    /**
      * APIMethod: zoomToScale
-     * Zoom to a specified scale 
-     * 
+     * Zoom to a specified scale
+     *
      * Parameters:
      * scale - {float}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified scale. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified scale. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
-     * 
+     *
      */
     zoomToScale: function(scale, closest) {
-        var res = OpenLayers.Util.getResolutionFromScale(scale, 
+        var res = OpenLayers.Util.getResolutionFromScale(scale,
                                                          this.baseLayer.units);
         var size = this.getSize();
         var w_deg = size.w * res;
@@ -16507,7 +16507,7 @@
                                            center.lat + h_deg / 2);
         this.zoomToExtent(extent, closest);
     },
-    
+
   /********************************************************/
   /*                                                      */
   /*             Translation Functions                    */
@@ -16516,24 +16516,24 @@
   /*           LonLat, LayerPx, and ViewPortPx            */
   /*                                                      */
   /********************************************************/
-      
+
   //
   // TRANSLATION: LonLat <-> ViewPortPx
   //
 
     /**
      * Method: getLonLatFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view
      *                       port <OpenLayers.Pixel>, translated into lon/lat
      *                       by the current base layer.
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
-        var lonlat = null; 
+        var lonlat = null;
         if (this.baseLayer != null) {
             lonlat = this.baseLayer.getLonLatFromViewPortPx(viewPortPx);
         }
@@ -16542,37 +16542,37 @@
 
     /**
      * APIMethod: getViewPortPxFromLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in 
-     *                      <OpenLayers.LonLat>, translated into view port 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     *                      <OpenLayers.LonLat>, translated into view port
      *                      pixels by the current base layer.
      */
     getViewPortPxFromLonLat: function (lonlat) {
-        var px = null; 
+        var px = null;
         if (this.baseLayer != null) {
             px = this.baseLayer.getViewPortPxFromLonLat(lonlat);
         }
         return px;
     },
 
-    
+
   //
   // CONVENIENCE TRANSLATION FUNCTIONS FOR API
   //
 
     /**
      * APIMethod: getLonLatFromPixel
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      *
      * Returns:
      * {<OpenLayers.LonLat>} An OpenLayers.LonLat corresponding to the given
-     *                       OpenLayers.Pixel, translated into lon/lat by the 
+     *                       OpenLayers.Pixel, translated into lon/lat by the
      *                       current base layer
      */
     getLonLatFromPixel: function (px) {
@@ -16584,12 +16584,12 @@
      * Returns a pixel location given a map location.  The map location is
      *     translated to an integer pixel location (in viewport pixel
      *     coordinates) by the current base layer.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} A map location.
-     * 
-     * Returns: 
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel corresponding to the 
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel corresponding to the
      *     <OpenLayers.LonLat> translated into view port pixels by the current
      *     base layer.
      */
@@ -16608,12 +16608,12 @@
 
     /**
      * APIMethod: getViewPortPxFromLayerPx
-     * 
+     *
      * Parameters:
      * layerPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} Layer Pixel translated into ViewPort Pixel 
+     * {<OpenLayers.Pixel>} Layer Pixel translated into ViewPort Pixel
      *                      coordinates
      */
     getViewPortPxFromLayerPx:function(layerPx) {
@@ -16621,19 +16621,19 @@
         if (layerPx != null) {
             var dX = parseInt(this.layerContainerDiv.style.left);
             var dY = parseInt(this.layerContainerDiv.style.top);
-            viewPortPx = layerPx.add(dX, dY);            
+            viewPortPx = layerPx.add(dX, dY);
         }
         return viewPortPx;
     },
-    
+
     /**
      * APIMethod: getLayerPxFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} ViewPort Pixel translated into Layer Pixel 
+     * {<OpenLayers.Pixel>} ViewPort Pixel translated into Layer Pixel
      *                      coordinates
      */
     getLayerPxFromViewPortPx:function(viewPortPx) {
@@ -16648,14 +16648,14 @@
         }
         return layerPx;
     },
-    
+
   //
   // TRANSLATION: LonLat <-> LayerPx
   //
 
     /**
      * Method: getLonLatFromLayerPx
-     * 
+     *
      * Parameters:
      * px - {<OpenLayers.Pixel>}
      *
@@ -16665,24 +16665,24 @@
     getLonLatFromLayerPx: function (px) {
        //adjust for displacement of layerContainerDiv
        px = this.getViewPortPxFromLayerPx(px);
-       return this.getLonLatFromViewPortPx(px);         
+       return this.getLonLatFromViewPortPx(px);
     },
-    
+
     /**
      * APIMethod: getLayerPxFromLonLat
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} lonlat
      *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in 
-     *                      <OpenLayers.LonLat>, translated into layer pixels 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     *                      <OpenLayers.LonLat>, translated into layer pixels
      *                      by the current base layer
      */
     getLayerPxFromLonLat: function (lonlat) {
        //adjust for displacement of layerContainerDiv
        var px = this.getPixelFromLonLat(lonlat);
-       return this.getLayerPxFromViewPortPx(px);         
+       return this.getLayerPxFromViewPortPx(px);
     },
 
     CLASS_NAME: "OpenLayers.Map"
@@ -16714,8 +16714,8 @@
 
 /**
  * Class: OpenLayers.Marker
- * Instances of OpenLayers.Marker are a combination of a 
- * <OpenLayers.LonLat> and an <OpenLayers.Icon>.  
+ * Instances of OpenLayers.Marker are a combination of a
+ * <OpenLayers.LonLat> and an <OpenLayers.Icon>.
  *
  * Markers are generally added to a special layer called
  * <OpenLayers.Layer.Markers>.
@@ -16739,32 +16739,32 @@
  * markers using that same icon.
  */
 OpenLayers.Marker = OpenLayers.Class({
-    
-    /** 
-     * Property: icon 
+
+    /**
+     * Property: icon
      * {<OpenLayers.Icon>} The icon used by this marker.
      */
     icon: null,
 
-    /** 
-     * Property: lonlat 
+    /**
+     * Property: lonlat
      * {<OpenLayers.LonLat>} location of object
      */
     lonlat: null,
-    
-    /** 
-     * Property: events 
+
+    /**
+     * Property: events
      * {<OpenLayers.Events>} the event handler.
      */
     events: null,
-    
-    /** 
-     * Property: map 
+
+    /**
+     * Property: map
      * {<OpenLayers.Map>} the map this marker is attached to
      */
     map: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Marker
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>} the position of this marker
@@ -16772,7 +16772,7 @@
      */
     initialize: function(lonlat, icon) {
         this.lonlat = lonlat;
-        
+
         var newIcon = (icon) ? icon : OpenLayers.Marker.defaultIcon();
         if (this.icon == null) {
             this.icon = newIcon;
@@ -16784,10 +16784,10 @@
         }
         this.events = new OpenLayers.Events(this, this.icon.imageDiv, null);
     },
-    
+
     /**
      * APIMethod: destroy
-     * Destroy the marker. You must first remove the marker from any 
+     * Destroy the marker. You must first remove the marker from any
      * layer which it has been added to, or you will get buggy behavior.
      * (This can not be done within the marker since the marker does not
      * know which layer it is attached to.)
@@ -16806,23 +16806,23 @@
             this.icon = null;
         }
     },
-    
-    /** 
+
+    /**
     * Method: draw
     * Calls draw on the icon, and returns that output.
-    * 
+    *
     * Parameters:
     * px - {<OpenLayers.Pixel>}
-    * 
+    *
     * Returns:
-    * {DOMElement} A new DOM Image with this marker's icon set at the 
+    * {DOMElement} A new DOM Image with this marker's icon set at the
     * location passed-in
     */
     draw: function(px) {
         return this.icon.draw(px);
-    }, 
+    },
 
-    /** 
+    /**
     * Method: erase
     * Erases any drawn elements for this marker.
     */
@@ -16830,7 +16830,7 @@
         if (this.icon != null) {
             this.icon.erase();
         }
-    }, 
+    },
 
     /**
     * Method: moveTo
@@ -16842,19 +16842,19 @@
     moveTo: function (px) {
         if ((px != null) && (this.icon != null)) {
             this.icon.moveTo(px);
-        }           
+        }
         this.lonlat = this.map.getLonLatFromLayerPx(px);
     },
 
     /**
      * APIMethod: isDrawn
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the marker is drawn.
      */
     isDrawn: function() {
         var isDrawn = (this.icon && this.icon.isDrawn());
-        return isDrawn;   
+        return isDrawn;
     },
 
     /**
@@ -16864,15 +16864,15 @@
      * {Boolean} Whether or not the marker is currently visible on screen.
      */
     onScreen:function() {
-        
+
         var onScreen = false;
         if (this.map) {
             var screenBounds = this.map.getExtent();
             onScreen = screenBounds.containsLonLat(this.lonlat);
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: inflate
      * Englarges the markers icon by the specified ratio.
@@ -16886,14 +16886,14 @@
             var newSize = new OpenLayers.Size(this.icon.size.w * inflate,
                                               this.icon.size.h * inflate);
             this.icon.setSize(newSize);
-        }        
+        }
     },
-    
-    /** 
+
+    /**
      * Method: setOpacity
-     * Change the opacity of the marker by changin the opacity of 
+     * Change the opacity of the marker by changin the opacity of
      *   its icon
-     * 
+     *
      * Parameters:
      * opacity - {float}  Specified as fraction (0.4, etc)
      */
@@ -16904,18 +16904,18 @@
     /**
      * Method: setUrl
      * Change URL of the Icon Image.
-     * 
-     * url - {String} 
+     *
+     * url - {String}
      */
     setUrl: function(url) {
         this.icon.setUrl(url);
-    },    
+    },
 
-    /** 
+    /**
      * Method: display
      * Hide or show the icon
-     * 
-     * display - {Boolean} 
+     *
+     * display - {Boolean}
      */
     display: function(display) {
         this.icon.display(display);
@@ -16928,7 +16928,7 @@
 /**
  * Function: defaultIcon
  * Creates a default <OpenLayers.Icon>.
- * 
+ *
  * Returns:
  * {<OpenLayers.Icon>} A default OpenLayers.Icon to use for a marker
  */
@@ -16939,10 +16939,10 @@
                     return new OpenLayers.Pixel(-(size.w/2), -size.h);
                  };
 
-    return new OpenLayers.Icon(url, size, null, calculateOffset);        
+    return new OpenLayers.Icon(url, size, null, calculateOffset);
 };
-    
 
+
 /* ======================================================================
     OpenLayers/Request.js
    ====================================================================== */
@@ -16962,7 +16962,7 @@
  *     W3C compliant <OpenLayers.Request.XMLHttpRequest> class.
  */
 OpenLayers.Request = {
-    
+
     /**
      * Constant: DEFAULT_CONFIG
      * {Object} Default configuration for all requests.
@@ -16982,17 +16982,17 @@
         failure: null,
         scope: null
     },
-    
+
     /**
      * APIProperty: events
-     * {<OpenLayers.Events>} An events object that handles all 
+     * {<OpenLayers.Events>} An events object that handles all
      *     events on the {<OpenLayers.Request>} object.
      *
      * All event listeners will receive an event object with three properties:
      * request - {<OpenLayers.Request.XMLHttpRequest>} The request object.
      * config - {Object} The config object sent to the specific request method.
      * requestUrl - {String} The request url.
-     * 
+     *
      * Supported event types:
      * complete - Triggered when we have a response from the request, if a
      *     listener returns false, no further response processing will take
@@ -17001,7 +17001,7 @@
      * failure - Triggered when the HTTP response does not have a success code.
      */
     events: new OpenLayers.Events(this, null, ["complete", "success", "failure"]),
-    
+
     /**
      * APIMethod: issue
      * Create a new XMLHttpRequest object, open it, set any headers, bind
@@ -17058,7 +17058,7 @@
      * {XMLHttpRequest} Request object.  To abort the request before a response
      *     is received, call abort() on the request object.
      */
-    issue: function(config) {        
+    issue: function(config) {
         // apply default config - proxy host may have changed
         var defaultConfig = OpenLayers.Util.extend(
             this.DEFAULT_CONFIG,
@@ -17090,7 +17090,7 @@
         var complete = (config.scope) ?
             OpenLayers.Function.bind(config.callback, config.scope) :
             config.callback;
-        
+
         // optional success callback
         var success;
         if(config.success) {
@@ -17106,9 +17106,9 @@
                 OpenLayers.Function.bind(config.failure, config.scope) :
                 config.failure;
         }
-        
+
         var events = this.events;
-         
+
         request.onreadystatechange = function() {
             if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
                 var proceed = events.triggerEvent(
@@ -17126,7 +17126,7 @@
                             success(request);
                         }
                     }
-                    if(request.status && (request.status < 200 || request.status >= 300)) {                    
+                    if(request.status && (request.status < 200 || request.status >= 300)) {
                         events.triggerEvent(
                             "failure",
                             {request: request, config: config, requestUrl: url}
@@ -17138,7 +17138,7 @@
                 }
             }
         };
-        
+
         // send request (optionally with data) and return
         // call in a timeout for asynchronous requests so the return is
         // available before readyState == 4 for cached docs
@@ -17151,7 +17151,7 @@
         }
         return request;
     },
-    
+
     /**
      * APIMethod: GET
      * Send an HTTP GET request.  Additional configuration properties are
@@ -17162,7 +17162,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17170,7 +17170,7 @@
         config = OpenLayers.Util.extend(config, {method: "GET"});
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: POST
      * Send a POST request.  Additional configuration properties are
@@ -17182,7 +17182,7 @@
      *     See the <issue> method for documentation of allowed properties.  The
      *     default "Content-Type" header will be set to "application-xml" if
      *     none is provided.  This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17195,7 +17195,7 @@
         }
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: PUT
      * Send an HTTP PUT request.  Additional configuration properties are
@@ -17207,7 +17207,7 @@
      *     See the <issue> method for documentation of allowed properties.  The
      *     default "Content-Type" header will be set to "application-xml" if
      *     none is provided.  This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17220,7 +17220,7 @@
         }
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: DELETE
      * Send an HTTP DELETE request.  Additional configuration properties are
@@ -17231,7 +17231,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17239,7 +17239,7 @@
         config = OpenLayers.Util.extend(config, {method: "DELETE"});
         return OpenLayers.Request.issue(config);
     },
-  
+
     /**
      * APIMethod: HEAD
      * Send an HTTP HEAD request.  Additional configuration properties are
@@ -17250,7 +17250,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17258,7 +17258,7 @@
         config = OpenLayers.Util.extend(config, {method: "HEAD"});
         return OpenLayers.Request.issue(config);
     },
-    
+
     /**
      * APIMethod: OPTIONS
      * Send an HTTP OPTIONS request.  Additional configuration properties are
@@ -17269,7 +17269,7 @@
      * config - {Object} Object with properties for configuring the request.
      *     See the <issue> method for documentation of allowed properties.
      *     This object is modified and should not be reused.
-     * 
+     *
      * Returns:
      * {XMLHttpRequest} Request object.
      */
@@ -17303,14 +17303,14 @@
  */
 OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, {
 
-    /** 
+    /**
      * Property: url
      * {String} The URL of the image being requested. No default. Filled in by
-     * layer.getURL() function. 
+     * layer.getURL() function.
      */
     url: null,
-    
-    /** 
+
+    /**
      * Property: imgDiv
      * {DOMElement} The div element which wraps the image.
      */
@@ -17319,22 +17319,22 @@
     /**
      * Property: frame
      * {DOMElement} The image element is appended to the frame.  Any gutter on
-     * the image will be hidden behind the frame. 
-     */ 
-    frame: null, 
-    
+     * the image will be hidden behind the frame.
+     */
+    frame: null,
+
     /**
      * Property: layerAlphaHack
      * {Boolean} True if the png alpha hack needs to be applied on the layer's div.
      */
     layerAlphaHack: null,
-    
+
     /**
      * Property: isBackBuffer
      * {Boolean} Is this tile a back buffer tile?
      */
     isBackBuffer: false,
-    
+
     /**
      * Property: lastRatio
      * {Float} Used in transition code only.  This is the previous ratio
@@ -17353,7 +17353,7 @@
      *     tiles that have been loaded can be used.
      */
     isFirstDraw: true,
-        
+
     /**
      * Property: backBufferTile
      * {<OpenLayers.Tile>} A clone of the tile used to create transition
@@ -17361,33 +17361,33 @@
      */
     backBufferTile: null,
 
-    /** TBD 3.0 - reorder the parameters to the init function to remove 
-     *             URL. the getUrl() function on the layer gets called on 
+    /** TBD 3.0 - reorder the parameters to the init function to remove
+     *             URL. the getUrl() function on the layer gets called on
      *             each draw(), so no need to specify it here.
-     * 
+     *
      * Constructor: OpenLayers.Tile.Image
      * Constructor for a new <OpenLayers.Tile.Image> instance.
-     * 
+     *
      * Parameters:
      * layer - {<OpenLayers.Layer>} layer that the tile will go in.
      * position - {<OpenLayers.Pixel>}
      * bounds - {<OpenLayers.Bounds>}
      * url - {<String>} Deprecated. Remove me in 3.0.
      * size - {<OpenLayers.Size>}
-     */   
+     */
     initialize: function(layer, position, bounds, url, size) {
         OpenLayers.Tile.prototype.initialize.apply(this, arguments);
 
         this.url = url; //deprecated remove me
-        
-        this.frame = document.createElement('div'); 
-        this.frame.style.overflow = 'hidden'; 
-        this.frame.style.position = 'absolute'; 
 
+        this.frame = document.createElement('div');
+        this.frame.style.overflow = 'hidden';
+        this.frame.style.position = 'absolute';
+
         this.layerAlphaHack = this.layer.alpha && OpenLayers.Util.alphaHack();
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -17395,13 +17395,13 @@
         if (this.imgDiv != null)  {
             if (this.layerAlphaHack) {
                 // unregister the "load" handler
-                OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0].id);                
+                OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0].id);
             }
 
             // unregister the "load" and "error" handlers. Only the "error" handler if
             // this.layerAlphaHack is true.
             OpenLayers.Event.stopObservingElement(this.imgDiv.id);
-            
+
             if (this.imgDiv.parentNode == this.frame) {
                 this.frame.removeChild(this.imgDiv);
                 this.imgDiv.map = null;
@@ -17411,19 +17411,19 @@
             this.imgDiv.src = OpenLayers.Util.getImagesLocation() + "blank.gif";
         }
         this.imgDiv = null;
-        if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) { 
-            this.layer.div.removeChild(this.frame); 
+        if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) {
+            this.layer.div.removeChild(this.frame);
         }
-        this.frame = null; 
-        
+        this.frame = null;
+
         /* clean up the backBufferTile if it exists */
         if (this.backBufferTile) {
             this.backBufferTile.destroy();
             this.backBufferTile = null;
         }
-        
+
         this.layer.events.unregister("loadend", this, this.resetBackBuffer);
-        
+
         OpenLayers.Tile.prototype.destroy.apply(this, arguments);
     },
 
@@ -17438,27 +17438,27 @@
      */
     clone: function (obj) {
         if (obj == null) {
-            obj = new OpenLayers.Tile.Image(this.layer, 
-                                            this.position, 
-                                            this.bounds, 
-                                            this.url, 
-                                            this.size);        
-        } 
-        
+            obj = new OpenLayers.Tile.Image(this.layer,
+                                            this.position,
+                                            this.bounds,
+                                            this.url,
+                                            this.size);
+        }
+
         //pick up properties from superclass
         obj = OpenLayers.Tile.prototype.clone.apply(this, [obj]);
-        
+
         //dont want to directly copy the image div
         obj.imgDiv = null;
-            
-        
+
+
         return obj;
     },
-    
+
     /**
      * Method: draw
      * Check that a tile should be drawn, and draw it.
-     * 
+     *
      * Returns:
      * {Boolean} Always returns true.
      */
@@ -17467,7 +17467,7 @@
             this.bounds = this.getBoundsFromBaseLayer(this.position);
         }
         var drawTile = OpenLayers.Tile.prototype.draw.apply(this, arguments);
-        
+
         if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS, this.layer.transitionEffect) != -1) {
             if (drawTile) {
                 //we use a clone of this tile to create a double buffer for visual
@@ -17481,10 +17481,10 @@
                     // the backBufferTile behind the main tile so the tiles can
                     // load over top and display as soon as they are loaded.
                     this.backBufferTile.isBackBuffer = true;
-                    
+
                     // potentially end any transition effects when the tile loads
                     this.events.register('loadend', this, this.resetBackBuffer);
-                    
+
                     // clear transition back buffer tile only after all tiles in
                     // this layer have loaded to avoid visual glitches
                     this.layer.events.register("loadend", this, this.resetBackBuffer);
@@ -17502,45 +17502,45 @@
             if (drawTile && this.isFirstDraw) {
                 this.events.register('loadend', this, this.showTile);
                 this.isFirstDraw = false;
-            }   
-        }    
-        
+            }
+        }
+
         if (!drawTile) {
             return false;
         }
-        
+
         if (this.isLoading) {
             //if we're already loading, send 'reload' instead of 'loadstart'.
-            this.events.triggerEvent("reload"); 
+            this.events.triggerEvent("reload");
         } else {
             this.isLoading = true;
             this.events.triggerEvent("loadstart");
         }
-        
+
         return this.renderTile();
     },
-    
-    /** 
+
+    /**
      * Method: resetBackBuffer
      * Triggered by two different events, layer loadend, and tile loadend.
-     *     In any of these cases, we check to see if we can hide the 
-     *     backBufferTile yet and update its parameters to match the 
+     *     In any of these cases, we check to see if we can hide the
+     *     backBufferTile yet and update its parameters to match the
      *     foreground tile.
      *
      * Basic logic:
      *  - If the backBufferTile hasn't been drawn yet, reset it
      *  - If layer is still loading, show foreground tile but don't hide
      *    the backBufferTile yet
-     *  - If layer is done loading, reset backBuffer tile and show 
+     *  - If layer is done loading, reset backBuffer tile and show
      *    foreground tile
      */
     resetBackBuffer: function() {
         this.showTile();
-        if (this.backBufferTile && 
+        if (this.backBufferTile &&
             (this.isFirstDraw || !this.layer.numLoadingTiles)) {
             this.isFirstDraw = false;
             // check to see if the backBufferTile is within the max extents
-            // before rendering it 
+            // before rendering it
             var maxExtent = this.layer.maxExtent;
             var withinMaxExtent = (maxExtent &&
                                    this.bounds.intersectsBounds(maxExtent, false));
@@ -17557,7 +17557,7 @@
             this.backBufferTile.hide();
         }
     },
-    
+
     /**
      * Method: renderTile
      * Internal function to actually initialize the image tile,
@@ -17569,7 +17569,7 @@
         }
 
         this.imgDiv.viewRequestID = this.layer.map.viewRequestID;
-        
+
         if (this.layer.async) {
             // Asyncronous image requests call the asynchronous getURL method
             // on the layer to fetch an image that covers 'this.bounds', in the scope of
@@ -17579,16 +17579,16 @@
         } else {
             // syncronous image requests get the url and position the frame immediately,
             // and don't wait for an image request to come back.
-          
+
             // needed for changing to a different server for onload error
             if (this.layer.url instanceof Array) {
                 this.imgDiv.urls = this.layer.url.slice();
             }
-          
+
             this.url = this.layer.getURL(this.bounds);
-          
+
             // position the frame immediately
-            this.positionImage(); 
+            this.positionImage();
         }
         return true;
     },
@@ -17604,12 +17604,12 @@
         // returned, do not attempt to use it for size computation
         if ( this.layer == null )
             return;
-        
-        // position the frame 
-        OpenLayers.Util.modifyDOMElement(this.frame, 
-                                          null, this.position, this.size);   
 
-        var imageSize = this.layer.getImageSize(); 
+        // position the frame
+        OpenLayers.Util.modifyDOMElement(this.frame,
+                                          null, this.position, this.size);
+
+        var imageSize = this.layer.getImageSize();
         if (this.layerAlphaHack) {
             OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,
                     null, null, imageSize, this.url);
@@ -17620,17 +17620,17 @@
         }
     },
 
-    /** 
+    /**
      * Method: clear
-     *  Clear the tile of any bounds/position-related data so that it can 
+     *  Clear the tile of any bounds/position-related data so that it can
      *   be reused in a new location.
      */
     clear: function() {
         if(this.imgDiv) {
             this.hide();
-            if (OpenLayers.Tile.Image.useBlankTile) { 
+            if (OpenLayers.Tile.Image.useBlankTile) {
                 this.imgDiv.src = OpenLayers.Util.getImagesLocation() + "blank.gif";
-            }    
+            }
         }
     },
 
@@ -17639,10 +17639,10 @@
      * Creates the imgDiv property on the tile.
      */
     initImgDiv: function() {
-        
-        var offset = this.layer.imageOffset; 
-        var size = this.layer.getImageSize(); 
-     
+
+        var offset = this.layer.imageOffset;
+        var size = this.layer.getImageSize();
+
         if (this.layerAlphaHack) {
             this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
                                                            offset,
@@ -17663,7 +17663,7 @@
                                                       null,
                                                       true);
         }
-        
+
         this.imgDiv.className = 'olTileImage';
 
         /* checkImgURL used to be used to called as a work around, but it
@@ -17675,43 +17675,43 @@
             OpenLayers.Function.bind(this.checkImgURL, this) );
         */
         this.frame.style.zIndex = this.isBackBuffer ? 0 : 1;
-        this.frame.appendChild(this.imgDiv); 
-        this.layer.div.appendChild(this.frame); 
+        this.frame.appendChild(this.imgDiv);
+        this.layer.div.appendChild(this.frame);
 
         if(this.layer.opacity != null) {
-            
+
             OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
-                                             null, null, null, 
+                                             null, null, null,
                                              this.layer.opacity);
         }
 
         // we need this reference to check back the viewRequestID
         this.imgDiv.map = this.layer.map;
 
-        //bind a listener to the onload of the image div so that we 
+        //bind a listener to the onload of the image div so that we
         // can register when a tile has finished loading.
         var onload = function() {
-            
-            //normally isLoading should always be true here but there are some 
+
+            //normally isLoading should always be true here but there are some
             // right funky conditions where loading and then reloading a tile
-            // with the same url *really*fast*. this check prevents sending 
+            // with the same url *really*fast*. this check prevents sending
             // a 'loadend' if the msg has already been sent
             //
-            if (this.isLoading) { 
-                this.isLoading = false; 
-                this.events.triggerEvent("loadend"); 
+            if (this.isLoading) {
+                this.isLoading = false;
+                this.events.triggerEvent("loadend");
             }
         };
-        
-        if (this.layerAlphaHack) { 
-            OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load', 
-                                     OpenLayers.Function.bind(onload, this));    
-        } else { 
-            OpenLayers.Event.observe(this.imgDiv, 'load', 
-                                 OpenLayers.Function.bind(onload, this)); 
-        } 
-        
 
+        if (this.layerAlphaHack) {
+            OpenLayers.Event.observe(this.imgDiv.childNodes[0], 'load',
+                                     OpenLayers.Function.bind(onload, this));
+        } else {
+            OpenLayers.Event.observe(this.imgDiv, 'load',
+                                 OpenLayers.Function.bind(onload, this));
+        }
+
+
         // Bind a listener to the onerror of the image div so that we
         // can registere when a tile has finished loading with errors.
         var onerror = function() {
@@ -17737,18 +17737,18 @@
      * the imgDiv display to 'none', as either (a) it will be reset to visible
      * when the new URL loads in the image, or (b) we don't want to display
      * this tile after all because its new bounds are outside our maxExtent.
-     * 
+     *
      * This function should no longer  be neccesary with the improvements to
      * Grid.js in OpenLayers 2.3. The lack of a good isEquivilantURL function
-     * caused problems in 2.2, but it's possible that with the improved 
+     * caused problems in 2.2, but it's possible that with the improved
      * isEquivilant URL function, this might be neccesary at some point.
-     * 
-     * See discussion in the thread at 
+     *
+     * See discussion in the thread at
      * http://openlayers.org/pipermail/dev/2007-January/000205.html
      */
     checkImgURL: function () {
         // Sometimes our image will load after it has already been removed
-        // from the map, in which case this check is not needed.  
+        // from the map, in which case this check is not needed.
         if (this.layer) {
             var loaded = this.layerAlphaHack ? this.imgDiv.firstChild.src : this.imgDiv.src;
             if (!OpenLayers.Util.isEquivalentUrl(loaded, this.url)) {
@@ -17756,7 +17756,7 @@
             }
         }
     },
-    
+
     /**
      * Method: startTransition
      * This method is invoked on tiles that are backBuffers for tiles in the
@@ -17778,15 +17778,15 @@
         if (this.backBufferTile.resolution) {
             ratio = this.backBufferTile.resolution / this.layer.getResolution();
         }
-        
+
         // if the ratio is not the same as it was last time (i.e. we are
         // zooming), then we need to adjust the backBuffer tile
         if (ratio != this.lastRatio) {
             if (this.layer.transitionEffect == 'resize') {
-                // In this case, we can just immediately resize the 
+                // In this case, we can just immediately resize the
                 // backBufferTile.
                 var upperLeft = new OpenLayers.LonLat(
-                    this.backBufferTile.bounds.left, 
+                    this.backBufferTile.bounds.left,
                     this.backBufferTile.bounds.top
                 );
                 var size = new OpenLayers.Size(
@@ -17795,10 +17795,10 @@
                 );
 
                 var px = this.layer.map.getLayerPxFromLonLat(upperLeft);
-                OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame, 
+                OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,
                                                  null, px, size);
                 var imageSize = this.backBufferTile.imageSize;
-                imageSize = new OpenLayers.Size(imageSize.w * ratio, 
+                imageSize = new OpenLayers.Size(imageSize.w * ratio,
                                                 imageSize.h * ratio);
                 var imageOffset = this.backBufferTile.imageOffset;
                 if(imageOffset) {
@@ -17827,8 +17827,8 @@
         this.lastRatio = ratio;
 
     },
-    
-    /** 
+
+    /**
      * Method: show
      * Show the tile by showing its frame.
      */
@@ -17836,29 +17836,29 @@
         this.frame.style.display = '';
         // Force a reflow on gecko based browsers to actually show the element
         // before continuing execution.
-        if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS, 
+        if (OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,
                 this.layer.transitionEffect) != -1) {
-            if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) { 
-                this.frame.scrollLeft = this.frame.scrollLeft; 
-            } 
+            if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) {
+                this.frame.scrollLeft = this.frame.scrollLeft;
+            }
         }
     },
-    
-    /** 
+
+    /**
      * Method: hide
      * Hide the tile by hiding its frame.
      */
     hide: function() {
         this.frame.style.display = 'none';
     },
-    
+
     CLASS_NAME: "OpenLayers.Tile.Image"
   }
 );
 
-OpenLayers.Tile.Image.useBlankTile = ( 
-    OpenLayers.Util.getBrowserName() == "safari" || 
-    OpenLayers.Util.getBrowserName() == "opera"); 
+OpenLayers.Tile.Image.useBlankTile = (
+    OpenLayers.Util.getBrowserName() == "safari" ||
+    OpenLayers.Util.getBrowserName() == "opera");
 /* ======================================================================
     OpenLayers/Control/OverviewMap.js
    ====================================================================== */
@@ -17867,7 +17867,7 @@
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
 
-/** 
+/**
  * @requires OpenLayers/Control.js
  * @requires OpenLayers/BaseTypes.js
  * @requires OpenLayers/Events.js
@@ -17875,8 +17875,8 @@
 
 /**
  * Class: OpenLayers.Control.OverviewMap
- * The OverMap control creates a small overview map, useful to display the 
- * extent of a zoomed map and your main map and provide additional 
+ * The OverMap control creates a small overview map, useful to display the
+ * extent of a zoomed map and your main map and provide additional
  * navigation options to the User.  By default the overview map is drawn in
  * the lower right corner of the main map. Create a new overview map with the
  * <OpenLayers.Control.OverviewMap> constructor.
@@ -17891,7 +17891,7 @@
      * {DOMElement} The DOM element that contains the overview map
      */
     element: null,
-    
+
     /**
      * APIProperty: ovmap
      * {<OpenLayers.Map>} A reference to the overview map itself.
@@ -17913,7 +17913,7 @@
      * If none are sent at construction, the base layer for the main map is used.
      */
     layers: null,
-    
+
     /**
      * APIProperty: minRectSize
      * {Integer} The minimum width or height (in pixels) of the extent
@@ -17922,7 +17922,7 @@
      *     <minRectDisplayClass> property.  Default is 15 pixels.
      */
     minRectSize: 15,
-    
+
     /**
      * APIProperty: minRectDisplayClass
      * {String} Replacement style class name for the extent rectangle when
@@ -17955,7 +17955,7 @@
      *     resolution at which to zoom farther in on the overview map.
      */
     maxRatio: 32,
-    
+
     /**
      * APIProperty: mapOptions
      * {Object} An object containing any non-default properties to be sent to
@@ -17972,7 +17972,7 @@
      *     to the center.
      */
     autoPan: false,
-    
+
     /**
      * Property: handlers
      * {Object}
@@ -17999,7 +17999,7 @@
         this.handlers = {};
         OpenLayers.Control.prototype.initialize.apply(this, [options]);
     },
-    
+
     /**
      * APIMethod: destroy
      * Deconstruct the control
@@ -18017,7 +18017,7 @@
 
         this.ovmap.destroy();
         this.ovmap = null;
-        
+
         this.element.removeChild(this.mapDiv);
         this.mapDiv = null;
 
@@ -18029,26 +18029,26 @@
             this.div.removeChild(this.maximizeDiv);
             this.maximizeDiv = null;
         }
-        
+
         if (this.minimizeDiv) {
             OpenLayers.Event.stopObservingElement(this.minimizeDiv);
             this.div.removeChild(this.minimizeDiv);
             this.minimizeDiv = null;
         }
-        
+
         this.map.events.un({
             "moveend": this.update,
             "changebaselayer": this.baseLayerDraw,
             scope: this
         });
 
-        OpenLayers.Control.prototype.destroy.apply(this, arguments);    
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
     },
 
     /**
      * Method: draw
      * Render the control in the browser.
-     */    
+     */
     draw: function() {
         OpenLayers.Control.prototype.draw.apply(this, arguments);
         if(!(this.layers.length > 0)) {
@@ -18072,14 +18072,14 @@
         this.mapDiv.style.position = 'relative';
         this.mapDiv.style.overflow = 'hidden';
         this.mapDiv.id = OpenLayers.Util.createUniqueID('overviewMap');
-        
+
         this.extentRectangle = document.createElement('div');
         this.extentRectangle.style.position = 'absolute';
         this.extentRectangle.style.zIndex = 1000;  //HACK
         this.extentRectangle.className = this.displayClass+'ExtentRectangle';
         this.mapDiv.appendChild(this.extentRectangle);
 
-        this.element.appendChild(this.mapDiv);  
+        this.element.appendChild(this.mapDiv);
 
         this.div.appendChild(this.element);
 
@@ -18091,48 +18091,48 @@
             // maximize button div
             var img = imgLocation + 'layer-switcher-maximize.png';
             this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(
-                                        this.displayClass + 'MaximizeButton', 
-                                        null, 
-                                        new OpenLayers.Size(18,18), 
-                                        img, 
+                                        this.displayClass + 'MaximizeButton',
+                                        null,
+                                        new OpenLayers.Size(18,18),
+                                        img,
                                         'absolute');
             this.maximizeDiv.style.display = 'none';
             this.maximizeDiv.className = this.displayClass + 'MaximizeButton';
-            OpenLayers.Event.observe(this.maximizeDiv, 'click', 
+            OpenLayers.Event.observe(this.maximizeDiv, 'click',
                 OpenLayers.Function.bindAsEventListener(this.maximizeControl,
                                                         this)
             );
             this.div.appendChild(this.maximizeDiv);
-    
+
             // minimize button div
             var img = imgLocation + 'layer-switcher-minimize.png';
             this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv(
-                                        'OpenLayers_Control_minimizeDiv', 
-                                        null, 
-                                        new OpenLayers.Size(18,18), 
-                                        img, 
+                                        'OpenLayers_Control_minimizeDiv',
+                                        null,
+                                        new OpenLayers.Size(18,18),
+                                        img,
                                         'absolute');
             this.minimizeDiv.style.display = 'none';
             this.minimizeDiv.className = this.displayClass + 'MinimizeButton';
-            OpenLayers.Event.observe(this.minimizeDiv, 'click', 
+            OpenLayers.Event.observe(this.minimizeDiv, 'click',
                 OpenLayers.Function.bindAsEventListener(this.minimizeControl,
                                                         this)
             );
             this.div.appendChild(this.minimizeDiv);
-            
+
             var eventsToStop = ['dblclick','mousedown'];
-            
+
             for (var i=0, len=eventsToStop.length; i<len; i++) {
 
-                OpenLayers.Event.observe(this.maximizeDiv, 
-                                         eventsToStop[i], 
+                OpenLayers.Event.observe(this.maximizeDiv,
+                                         eventsToStop[i],
                                          OpenLayers.Event.stop);
 
                 OpenLayers.Event.observe(this.minimizeDiv,
-                                         eventsToStop[i], 
+                                         eventsToStop[i],
                                          OpenLayers.Event.stop);
             }
-            
+
             this.minimizeControl();
         } else {
             // show the overview map
@@ -18141,12 +18141,12 @@
         if(this.map.getExtent()) {
             this.update();
         }
-        
+
         this.map.events.register('moveend', this, this.update);
 
         return this.div;
     },
-    
+
     /**
      * Method: baseLayerDraw
      * Draw the base layer - called if unable to complete in the initial draw
@@ -18184,7 +18184,7 @@
                                                        newTop));
         }
     },
-    
+
     /**
      * Method: mapDivClick
      * Handle browser events
@@ -18222,15 +18222,15 @@
         this.element.style.display = '';
         this.showToggle(false);
         if (e != null) {
-            OpenLayers.Event.stop(e);                                            
+            OpenLayers.Event.stop(e);
         }
     },
 
     /**
      * Method: minimizeControl
-     * Hide all the contents of the control, shrink the size, 
+     * Hide all the contents of the control, shrink the size,
      * add the maximize icon
-     * 
+     *
      * Parameters:
      * e - {<OpenLayers.Event>}
      */
@@ -18238,7 +18238,7 @@
         this.element.style.display = 'none';
         this.showToggle(true);
         if (e != null) {
-            OpenLayers.Event.stop(e);                                            
+            OpenLayers.Event.stop(e);
         }
     },
 
@@ -18247,7 +18247,7 @@
      * Hide/Show the toggle depending on whether the control is minimized
      *
      * Parameters:
-     * minimize - {Boolean} 
+     * minimize - {Boolean}
      */
     showToggle: function(minimize) {
         this.maximizeDiv.style.display = minimize ? '' : 'none';
@@ -18262,15 +18262,15 @@
         if(this.ovmap == null) {
             this.createMap();
         }
-        
+
         if(this.autoPan || !this.isSuitableOverview()) {
             this.updateOverview();
         }
-        
+
         // update extent rectangle
         this.updateRectToMap();
     },
-    
+
     /**
      * Method: isSuitableOverview
      * Determines if the overview map is suitable given the extent and
@@ -18283,7 +18283,7 @@
                                 Math.max(mapExtent.left, maxExtent.left),
                                 Math.max(mapExtent.bottom, maxExtent.bottom),
                                 Math.min(mapExtent.right, maxExtent.right),
-                                Math.min(mapExtent.top, maxExtent.top));        
+                                Math.min(mapExtent.top, maxExtent.top));
 
         if (this.ovmap.getProjection() != this.map.getProjection()) {
             testExtent = testExtent.transform(
@@ -18296,7 +18296,7 @@
                 (resRatio <= this.maxRatio) &&
                 (this.ovmap.getExtent().containsBounds(testExtent)));
     },
-    
+
     /**
      * Method updateOverview
      * Called by <update> if <isSuitableOverview> returns true
@@ -18307,7 +18307,7 @@
         var resRatio = targetRes / mapRes;
         if(resRatio > this.maxRatio) {
             // zoom in overview map
-            targetRes = this.minRatio * mapRes;            
+            targetRes = this.minRatio * mapRes;
         } else if(resRatio <= this.minRatio) {
             // zoom out overview map
             targetRes = this.maxRatio * mapRes;
@@ -18324,7 +18324,7 @@
             targetRes * this.resolutionFactor));
         this.updateRectToMap();
     },
-    
+
     /**
      * Method: createMap
      * Construct the map that this control contains
@@ -18332,14 +18332,14 @@
     createMap: function() {
         // create the overview map
         var options = OpenLayers.Util.extend(
-                        {controls: [], maxResolution: 'auto', 
+                        {controls: [], maxResolution: 'auto',
                          fallThrough: false}, this.mapOptions);
         this.ovmap = new OpenLayers.Map(this.mapDiv, options);
-        
+
         // prevent ovmap from being destroyed when the page unloads, because
         // the OverviewMap control has to do this (and does it).
         OpenLayers.Event.stopObserving(window, 'unload', this.ovmap.unloadDestroy);
-        
+
         this.ovmap.addLayers(this.layers);
         this.ovmap.zoomToMaxExtent();
         // check extent rectangle border width
@@ -18369,7 +18369,7 @@
             }
         );
         this.handlers.click.activate();
-        
+
         this.rectEvents = new OpenLayers.Events(this, this.extentRectangle,
                                                 null, true);
         this.rectEvents.register("mouseover", this, function(e) {
@@ -18393,7 +18393,7 @@
                 OpenLayers.INCHES_PER_UNIT[targetUnits] : 1;
         }
     },
-        
+
     /**
      * Method: updateRectToMap
      * Updates the extent rectangle position and size to match the map extent
@@ -18403,7 +18403,7 @@
         var bounds;
         if (this.ovmap.getProjection() != this.map.getProjection()) {
             bounds = this.map.getExtent().transform(
-                this.map.getProjectionObject(), 
+                this.map.getProjectionObject(),
                 this.ovmap.getProjectionObject() );
         } else {
             bounds = this.map.getExtent();
@@ -18413,7 +18413,7 @@
             this.setRectPxBounds(pxBounds);
         }
     },
-    
+
     /**
      * Method: updateMapToRect
      * Updates the map extent to match the extent rectangle position and size
@@ -18530,12 +18530,12 @@
         var size = this.ovmap.size;
         var res  = this.ovmap.getResolution();
         var center = this.ovmap.getExtent().getCenterLonLat();
-    
+
         var delta_x = overviewMapPx.x - (size.w / 2);
         var delta_y = overviewMapPx.y - (size.h / 2);
-        
+
         return new OpenLayers.LonLat(center.lon + delta_x * res ,
-                                     center.lat - delta_y * res); 
+                                     center.lat - delta_y * res);
     },
 
     /**
@@ -18546,7 +18546,7 @@
      * lonlat - {<OpenLayers.LonLat>}
      *
      * Returns:
-     * {<OpenLayers.Pixel>} Location which is the passed-in OpenLayers.LonLat, 
+     * {<OpenLayers.Pixel>} Location which is the passed-in OpenLayers.LonLat,
      * translated into overview map pixels
      */
     getOverviewPxFromLonLat: function(lonlat) {
@@ -18557,7 +18557,7 @@
             px = new OpenLayers.Pixel(
                         Math.round(1/res * (lonlat.lon - extent.left)),
                         Math.round(1/res * (extent.top - lonlat.lat)));
-        } 
+        }
         return px;
     },
 
@@ -18585,33 +18585,33 @@
  */
 OpenLayers.Feature = OpenLayers.Class({
 
-    /** 
-     * Property: layer 
-     * {<OpenLayers.Layer>} 
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer>}
      */
     layer: null,
 
-    /** 
-     * Property: id 
-     * {String} 
+    /**
+     * Property: id
+     * {String}
      */
     id: null,
-    
-    /** 
-     * Property: lonlat 
-     * {<OpenLayers.LonLat>} 
+
+    /**
+     * Property: lonlat
+     * {<OpenLayers.LonLat>}
      */
     lonlat: null,
 
-    /** 
-     * Property: data 
-     * {Object} 
+    /**
+     * Property: data
+     * {Object}
      */
     data: null,
 
-    /** 
-     * Property: marker 
-     * {<OpenLayers.Marker>} 
+    /**
+     * Property: marker
+     * {<OpenLayers.Marker>}
      */
     marker: null,
 
@@ -18622,21 +18622,21 @@
      */
     popupClass: OpenLayers.Popup.AnchoredBubble,
 
-    /** 
-     * Property: popup 
-     * {<OpenLayers.Popup>} 
+    /**
+     * Property: popup
+     * {<OpenLayers.Popup>}
      */
     popup: null,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Feature
      * Constructor for features.
      *
      * Parameters:
-     * layer - {<OpenLayers.Layer>} 
-     * lonlat - {<OpenLayers.LonLat>} 
-     * data - {Object} 
-     * 
+     * layer - {<OpenLayers.Layer>}
+     * lonlat - {<OpenLayers.LonLat>}
+     * data - {Object}
+     *
      * Returns:
      * {<OpenLayers.Feature>}
      */
@@ -18644,10 +18644,10 @@
         this.layer = layer;
         this.lonlat = lonlat;
         this.data = (data != null) ? data : {};
-        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"); 
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
 
-    /** 
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -18673,36 +18673,36 @@
             this.popup = null;
         }
     },
-    
+
     /**
      * Method: onScreen
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the feature is currently visible on screen
      *           (based on its 'lonlat' property)
      */
     onScreen:function() {
-        
+
         var onScreen = false;
         if ((this.layer != null) && (this.layer.map != null)) {
             var screenBounds = this.layer.map.getExtent();
             onScreen = screenBounds.containsLonLat(this.lonlat);
-        }    
+        }
         return onScreen;
     },
-    
 
+
     /**
      * Method: createMarker
      * Based on the data associated with the Feature, create and return a marker object.
      *
-     * Returns: 
+     * Returns:
      * {<OpenLayers.Marker>} A Marker Object created from the 'lonlat' and 'icon' properties
      *          set in this.data. If no 'lonlat' is set, returns null. If no
      *          'icon' is set, OpenLayers.Marker() will load the default image.
-     *          
+     *
      *          Note - this.marker is set to return value
-     * 
+     *
      */
     createMarker: function() {
 
@@ -18719,64 +18719,64 @@
      *   to also specify an alternative function for destroying it
      */
     destroyMarker: function() {
-        this.marker.destroy();  
+        this.marker.destroy();
     },
 
     /**
      * Method: createPopup
      * Creates a popup object created from the 'lonlat', 'popupSize',
      *     and 'popupContentHTML' properties set in this.data. It uses
-     *     this.marker.icon as default anchor. 
-     *  
-     *  If no 'lonlat' is set, returns null. 
+     *     this.marker.icon as default anchor.
+     *
+     *  If no 'lonlat' is set, returns null.
      *  If no this.marker has been created, no anchor is sent.
      *
      *  Note - the returned popup object is 'owned' by the feature, so you
      *      cannot use the popup's destroy method to discard the popup.
      *      Instead, you must use the feature's destroyPopup
-     * 
+     *
      *  Note - this.popup is set to return value
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * closeBox - {Boolean} create popup with closebox or not
-     * 
+     *
      * Returns:
      * {<OpenLayers.Popup>} Returns the created popup, which is also set
      *     as 'popup' property of this feature. Will be of whatever type
      *     specified by this feature's 'popupClass' property, but must be
      *     of type <OpenLayers.Popup>.
-     * 
+     *
      */
     createPopup: function(closeBox) {
 
         if (this.lonlat != null) {
-            
+
             var id = this.id + "_popup";
             var anchor = (this.marker) ? this.marker.icon : null;
 
             if (!this.popup) {
-                this.popup = new this.popupClass(id, 
+                this.popup = new this.popupClass(id,
                                                  this.lonlat,
                                                  this.data.popupSize,
                                                  this.data.popupContentHTML,
-                                                 anchor, 
-                                                 closeBox); 
-            }    
+                                                 anchor,
+                                                 closeBox);
+            }
             if (this.data.overflow != null) {
                 this.popup.contentDiv.style.overflow = this.data.overflow;
-            }    
-            
+            }
+
             this.popup.feature = this;
-        }        
+        }
         return this.popup;
     },
 
-    
+
     /**
      * Method: destroyPopup
      * Destroys the popup created via createPopup.
      *
-     * As with the marker, if user overrides the createPopup() function, s/he 
+     * As with the marker, if user overrides the createPopup() function, s/he
      *   should also be able to override the destruction
      */
     destroyPopup: function() {
@@ -18784,7 +18784,7 @@
             this.popup.feature = null;
             this.popup.destroy();
             this.popup = null;
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Feature"
@@ -18794,7 +18794,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the clear BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt
  * for the full text of the license. */
 
 /**
@@ -18811,9 +18811,9 @@
  *     click.  By setting a <pixelTolerance>, controls can also ignore clicks
  *     that include a drag.  Create a new instance with the
  *     <OpenLayers.Handler.Click> constructor.
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, {
 
@@ -18823,20 +18823,20 @@
      *     considered a double-click.
      */
     delay: 300,
-    
+
     /**
      * APIProperty: single
      * {Boolean} Handle single clicks.  Default is true.  If false, clicks
      * will not be reported.  If true, single-clicks will be reported.
      */
     single: true,
-    
+
     /**
      * APIProperty: double
      * {Boolean} Handle double-clicks.  Default is false.
      */
     'double': false,
-    
+
     /**
      * APIProperty: pixelTolerance
      * {Number} Maximum number of pixels between mouseup and mousedown for an
@@ -18846,7 +18846,7 @@
      *     constructed.
      */
     pixelTolerance: 0,
-    
+
     /**
      * APIProperty: stopSingle
      * {Boolean} Stop other listeners from being notified of clicks.  Default
@@ -18855,13 +18855,13 @@
      *     or single clicks).
      */
     stopSingle: false,
-    
+
     /**
      * APIProperty: stopDouble
      * {Boolean} Stop other listeners from being notified of double-clicks.
      *     Default is false.  If true, any click listeners registered before
      *     this one will not be notified of *any* double-click events.
-     * 
+     *
      * The one caveat with stopDouble is that given a map with two click
      *     handlers, one with stopDouble true and the other with stopSingle
      *     true, the stopSingle handler should be activated last to get
@@ -18877,24 +18877,24 @@
      * {Number} The id of the timeout waiting to clear the <delayedCall>.
      */
     timerId: null,
-    
+
     /**
      * Property: down
      * {<OpenLayers.Pixel>} The pixel location of the last mousedown.
      */
     down: null,
-    
+
     /**
      * Property: rightclickTimerId
-     * {Number} The id of the right mouse timeout waiting to clear the 
+     * {Number} The id of the right mouse timeout waiting to clear the
      *     <delayedEvent>.
      */
     rightclickTimerId: null,
-    
+
     /**
      * Constructor: OpenLayers.Handler.Click
      * Create a new click handler.
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control that is making use of
      *     this handler.  If a handler is being used without a control, the
@@ -18917,7 +18917,7 @@
             };
         }
     },
-    
+
     /**
      * Method: mousedown
      * Handle mousedown.  Only registered as a listener if pixelTolerance is
@@ -18931,7 +18931,7 @@
     /**
      * Method: mouseup
      * Handle mouseup.  Installed to support collection of right mouse events.
-     * 
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
@@ -18941,55 +18941,55 @@
         // Collect right mouse clicks from the mouseup
         //  IE - ignores the second right click in mousedown so using
         //  mouseup instead
-        if (this.checkModifiers(evt) && 
-            this.control.handleRightClicks && 
+        if (this.checkModifiers(evt) &&
+            this.control.handleRightClicks &&
             OpenLayers.Event.isRightClick(evt)) {
           propagate = this.rightclick(evt);
         }
 
         return propagate;
     },
-    
+
     /**
      * Method: rightclick
-     * Handle rightclick.  For a dblrightclick, we get two clicks so we need 
-     *     to always register for dblrightclick to properly handle single 
+     * Handle rightclick.  For a dblrightclick, we get two clicks so we need
+     *     to always register for dblrightclick to properly handle single
      *     clicks.
-     *     
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
     rightclick: function(evt) {
         if(this.passesTolerance(evt)) {
            if(this.rightclickTimerId != null) {
-                //Second click received before timeout this must be 
+                //Second click received before timeout this must be
                 // a double click
-                this.clearTimer();      
+                this.clearTimer();
                 this.callback('dblrightclick', [evt]);
                 return !this.stopDouble;
-            } else { 
-                //Set the rightclickTimerId, send evt only if double is 
+            } else {
+                //Set the rightclickTimerId, send evt only if double is
                 // true else trigger single
                 var clickEvent = this['double'] ?
-                    OpenLayers.Util.extend({}, evt) : 
+                    OpenLayers.Util.extend({}, evt) :
                     this.callback('rightclick', [evt]);
 
                 var delayedRightCall = OpenLayers.Function.bind(
-                    this.delayedRightCall, 
-                    this, 
+                    this.delayedRightCall,
+                    this,
                     clickEvent
                 );
                 this.rightclickTimerId = window.setTimeout(
                     delayedRightCall, this.delay
                 );
-            } 
+            }
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: delayedRightCall
-     * Sets <rightclickTimerId> to null.  And optionally triggers the 
+     * Sets <rightclickTimerId> to null.  And optionally triggers the
      *     rightclick callback if evt is set.
      */
     delayedRightCall: function(evt) {
@@ -18999,13 +18999,13 @@
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: dblclick
      * Handle dblclick.  For a dblclick, we get two clicks in some browsers
      *     (FF) and one in others (IE).  So we need to always register for
      *     dblclick to properly handle single clicks.
-     *     
+     *
      * Returns:
      * {Boolean} Continue propagating this event.
      */
@@ -19018,7 +19018,7 @@
         }
         return !this.stopDouble;
     },
-    
+
     /**
      * Method: click
      * Handle click.
@@ -19033,7 +19033,7 @@
                 this.clearTimer();
             } else {
                 // set the timer, send evt only if single is true
-                //use a clone of the event object because it will no longer 
+                //use a clone of the event object because it will no longer
                 //be a valid event object in IE in the timer callback
                 var clickEvent = this.single ?
                     OpenLayers.Util.extend({}, evt) : null;
@@ -19045,7 +19045,7 @@
         }
         return !this.stopSingle;
     },
-    
+
     /**
      * Method: passesTolerance
      * Determine whether the event is within the optional pixel tolerance.  Note
@@ -19085,7 +19085,7 @@
             this.rightclickTimerId = null;
         }
     },
-    
+
     /**
      * Method: delayedCall
      * Sets <timerId> to null.  And optionally triggers the click callback if
@@ -19151,14 +19151,14 @@
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, {
-  
-    /** 
+
+    /**
      * Property: started
      * {Boolean} When a mousedown event is received, we want to record it, but
-     *     not set 'dragging' until the mouse moves after starting. 
+     *     not set 'dragging' until the mouse moves after starting.
      */
     started: false,
-    
+
     /**
      * Property: stopDown
      * {Boolean} Stop propagation of mousedown events from getting to listeners
@@ -19166,19 +19166,19 @@
      */
     stopDown: true,
 
-    /** 
-     * Property: dragging 
-     * {Boolean} 
+    /**
+     * Property: dragging
+     * {Boolean}
      */
     dragging: false,
 
-    /** 
+    /**
      * Property: last
      * {<OpenLayers.Pixel>} The last pixel location of the drag.
      */
     last: null,
 
-    /** 
+    /**
      * Property: start
      * {<OpenLayers.Pixel>} The first pixel location of the drag.
      */
@@ -19189,17 +19189,17 @@
      * {Function}
      */
     oldOnselectstart: null,
-    
+
     /**
      * Property: interval
-     * {Integer} In order to increase performance, an interval (in 
-     *     milliseconds) can be set to reduce the number of drag events 
-     *     called. If set, a new drag event will not be set until the 
-     *     interval has passed. 
-     *     Defaults to 0, meaning no interval. 
+     * {Integer} In order to increase performance, an interval (in
+     *     milliseconds) can be set to reduce the number of drag events
+     *     called. If set, a new drag event will not be set until the
+     *     interval has passed.
+     *     Defaults to 0, meaning no interval.
      */
     interval: 0,
-    
+
     /**
      * Property: timeoutId
      * {String} The id of the timeout used for the mousedown interval.
@@ -19210,7 +19210,7 @@
     /**
      * Constructor: OpenLayers.Handler.Drag
      * Returns OpenLayers.Handler.Drag
-     * 
+     *
      * Parameters:
      * control - {<OpenLayers.Control>} The control that is making use of
      *     this handler.  If a handler is being used without a control, the
@@ -19221,17 +19221,17 @@
      *     expect to recieve a single argument, the pixel location of the event.
      *     Callbacks for 'move' and 'done' are supported. You can also speficy
      *     callbacks for 'down', 'up', and 'out' to respond to those events.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * The four methods below (down, move, up, and out) are used by subclasses
      *     to do their own processing related to these mouse events.
      */
-    
+
     /**
      * Method: down
      * This method is called during the handling of the mouse down event.
@@ -19242,7 +19242,7 @@
      */
     down: function(evt) {
     },
-    
+
     /**
      * Method: move
      * This method is called during the handling of the mouse move event.
@@ -19288,7 +19288,7 @@
      * Handle mousedown events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19306,12 +19306,12 @@
             this.down(evt);
             this.callback("down", [evt.xy]);
             OpenLayers.Event.stop(evt);
-            
+
             if(!this.oldOnselectstart) {
                 this.oldOnselectstart = (document.onselectstart) ? document.onselectstart : function() { return true; };
                 document.onselectstart = function() {return false;};
             }
-            
+
             propagate = !this.stopDown;
         } else {
             this.started = false;
@@ -19326,7 +19326,7 @@
      * Handle mousemove events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19347,7 +19347,7 @@
         }
         return true;
     },
-    
+
     /**
      * Method: removeTimeout
      * Private. Called by mousemove() to remove the drag timeout.
@@ -19361,7 +19361,7 @@
      * Handle mouseup events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19389,7 +19389,7 @@
      * Handle mouseout events
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean} Let the event propagate.
@@ -19397,7 +19397,7 @@
     mouseout: function (evt) {
         if (this.started && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
             var dragged = (this.start != this.last);
-            this.started = false; 
+            this.started = false;
             this.dragging = false;
             OpenLayers.Element.removeClass(
                 this.map.viewPortDiv, "olDragDown"
@@ -19417,12 +19417,12 @@
     /**
      * Method: click
      * The drag handler captures the click event.  If something else registers
-     *     for clicks on the same element, its listener will not be called 
+     *     for clicks on the same element, its listener will not be called
      *     after a drag.
-     * 
-     * Parameters: 
-     * evt - {Event} 
-     * 
+     *
+     * Parameters:
+     * evt - {Event}
+     *
      * Returns:
      * {Boolean} Let the event propagate.
      */
@@ -19434,7 +19434,7 @@
     /**
      * Method: activate
      * Activate the handler.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was successfully activated.
      */
@@ -19448,9 +19448,9 @@
     },
 
     /**
-     * Method: deactivate 
+     * Method: deactivate
      * Deactivate the handler.
-     * 
+     *
      * Returns:
      * {Boolean} The handler was successfully deactivated.
      */
@@ -19485,7 +19485,7 @@
  */
 
 /**
- * Class: OpenLayers.Handler.Feature 
+ * Class: OpenLayers.Handler.Feature
  * Handler to respond to mouse events related to a drawn feature.  Callbacks
  *     with the following keys will be notified of the following events
  *     associated with features: click, clickout, over, out, and dblclick.
@@ -19531,7 +19531,7 @@
      * {<OpenLayers.Pixel>} The location of the last mouseup.
      */
     up: null,
-    
+
     /**
      * Property: clickTolerance
      * {Number} The number of pixels the mouse can move between mousedown
@@ -19545,7 +19545,7 @@
      * Property: geometryTypes
      * To restrict dragging to a limited set of geometry types, send a list
      * of strings corresponding to the geometry class names.
-     * 
+     *
      * @type Array(String)
      */
     geometryTypes: null,
@@ -19576,17 +19576,17 @@
      *      value of stopUp. Defaults to false.
      */
     stopUp: false,
-    
+
     /**
      * Constructor: OpenLayers.Handler.Feature
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * layer - {<OpenLayers.Layer.Vector>}
      * callbacks - {Object} An object with a 'over' property whos value is
-     *     a function to be called when the mouse is over a feature. The 
+     *     a function to be called when the mouse is over a feature. The
      *     callback should expect to recieve a single argument, the feature.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, layer, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, [control, callbacks, options]);
@@ -19598,22 +19598,22 @@
      * Method: mousedown
      * Handle mouse down.  Stop propagation if a feature is targeted by this
      *     event (stops map dragging during feature selection).
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     mousedown: function(evt) {
         this.down = evt.xy;
         return this.handle(evt) ? !this.stopDown : true;
     },
-    
+
     /**
      * Method: mouseup
      * Handle mouse up.  Stop propagation if a feature is targeted by this
      *     event.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     mouseup: function(evt) {
         this.up = evt.xy;
@@ -19624,9 +19624,9 @@
      * Method: click
      * Handle click.  Call the "click" callback if click on a feature,
      *     or the "clickout" callback if click outside any feature.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19634,14 +19634,14 @@
     click: function(evt) {
         return this.handle(evt) ? !this.stopClick : true;
     },
-        
+
     /**
      * Method: mousemove
      * Handle mouse moves.  Call the "over" callback if moving in to a feature,
      *     or the "out" callback if moving out of a feature.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19649,17 +19649,17 @@
     mousemove: function(evt) {
         if (!this.callbacks['over'] && !this.callbacks['out']) {
             return true;
-        }     
+        }
         this.handle(evt);
         return true;
     },
-    
+
     /**
      * Method: dblclick
      * Handle dblclick.  Call the "dblclick" callback if dblclick on a feature.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {Boolean}
@@ -19748,7 +19748,7 @@
         }
         return handled;
     },
-    
+
     /**
      * Method: triggerCallback
      * Call the callback keyed in the event map with the supplied arguments.
@@ -19776,7 +19776,7 @@
     },
 
     /**
-     * Method: activate 
+     * Method: activate
      * Turn on the handler.  Returns false if the handler was already active.
      *
      * Returns:
@@ -19795,12 +19795,12 @@
         }
         return activated;
     },
-    
+
     /**
-     * Method: deactivate 
+     * Method: deactivate
      * Turn off the handler.  Returns false if the handler was already active.
      *
-     * Returns: 
+     * Returns:
      * {Boolean}
      */
     deactivate: function() {
@@ -19820,10 +19820,10 @@
         }
         return deactivated;
     },
-    
+
     /**
      * Method handleMapEvents
-     * 
+     *
      * Parameters:
      * evt - {Object}
      */
@@ -19832,7 +19832,7 @@
             this.moveLayerToTop();
         }
     },
-    
+
     /**
      * Method: moveLayerToTop
      * Moves the layer for this handler to the top, so mouse events can reach
@@ -19842,9 +19842,9 @@
         var index = Math.max(this.map.Z_INDEX_BASE['Feature'] - 1,
             this.layer.getZIndex()) + 1;
         this.layer.setZIndex(index);
-        
+
     },
-    
+
     /**
      * Method: moveLayerBack
      * Moves the layer back to the position determined by the map's layers
@@ -19867,7 +19867,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the clear BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt
  * for the full text of the license. */
 
 /**
@@ -19880,9 +19880,9 @@
  *      on the map that aren't DOM elements. For example one can use
  *      this handler to send WMS/GetFeatureInfo requests as the user
  *      moves the mouve over the map.
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, {
 
@@ -19892,7 +19892,7 @@
      *      the event is considered a hover. Default is 500.
      */
     delay: 500,
-    
+
     /**
      * APIProperty: pixelTolerance
      * {Integer} - Maximum number of pixels between mousemoves for
@@ -19919,7 +19919,7 @@
      * {Number} - The id of the timer.
      */
     timerId: null,
- 
+
     /**
      * Constructor: OpenLayers.Handler.Hover
      * Construct a hover handler.
@@ -20063,18 +20063,18 @@
 /**
  * Class: OpenLayers.Handler.MouseWheel
  * Handler for wheel up/down events.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
-    /** 
-     * Property: wheelListener 
-     * {function} 
+    /**
+     * Property: wheelListener
+     * {function}
      */
     wheelListener: null,
 
-    /** 
+    /**
      * Property: mousePosition
      * {<OpenLayers.Pixel>} mousePosition is necessary because
      * evt.clientX/Y is buggy in Moz on wheel events, so we cache and use the
@@ -20086,12 +20086,12 @@
      * Constructor: OpenLayers.Handler.MouseWheel
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * callbacks - {Object} An object containing a single function to be
      *                          called when the drag operation is finished.
      *                          The callback should expect to recieve a single
      *                          argument, the point geometry.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
@@ -20102,7 +20102,7 @@
 
     /**
      * Method: destroy
-     */    
+     */
     destroy: function() {
         OpenLayers.Handler.prototype.destroy.apply(this, arguments);
         this.wheelListener = null;
@@ -20112,22 +20112,22 @@
      *  Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
      */
 
-    /** 
+    /**
      * Method: onWheelEvent
      * Catch the wheel event and handle it xbrowserly
-     * 
+     *
      * Parameters:
-     * e - {Event} 
+     * e - {Event}
      */
     onWheelEvent: function(e){
-        
+
         // make sure we have a map and check keyboard modifiers
         if (!this.map || !this.checkModifiers(e)) {
             return;
         }
-        
-        // Ride up the element's DOM hierarchy to determine if it or any of 
-        //  its ancestors was: 
+
+        // Ride up the element's DOM hierarchy to determine if it or any of
+        //  its ancestors was:
         //   * specifically marked as scrollable
         //   * one of our layer divs
         //   * the map div
@@ -20135,7 +20135,7 @@
         var overScrollableDiv = false;
         var overLayerDiv = false;
         var overMapDiv = false;
-        
+
         var elem = OpenLayers.Event.element(e);
         while((elem != null) && !overMapDiv && !overScrollableDiv) {
 
@@ -20144,14 +20144,14 @@
                     if (elem.currentStyle) {
                         overflow = elem.currentStyle["overflow"];
                     } else {
-                        var style = 
+                        var style =
                             document.defaultView.getComputedStyle(elem, null);
                         var overflow = style.getPropertyValue("overflow");
                     }
-                    overScrollableDiv = ( overflow && 
+                    overScrollableDiv = ( overflow &&
                         (overflow == "auto") || (overflow == "scroll") );
                 } catch(err) {
-                    //sometimes when scrolling in a popup, this causes 
+                    //sometimes when scrolling in a popup, this causes
                     // obscure browser error
                 }
             }
@@ -20159,10 +20159,10 @@
             if (!overLayerDiv) {
                 for(var i=0, len=this.map.layers.length; i<len; i++) {
                     // Are we in the layer div? Note that we have two cases
-                    // here: one is to catch EventPane layers, which have a 
+                    // here: one is to catch EventPane layers, which have a
                     // pane above the layer (layer.pane)
-                    if (elem == this.map.layers[i].div 
-                        || elem == this.map.layers[i].pane) { 
+                    if (elem == this.map.layers[i].div
+                        || elem == this.map.layers[i].pane) {
                         overLayerDiv = true;
                         break;
                     }
@@ -20172,22 +20172,22 @@
 
             elem = elem.parentNode;
         }
-        
+
         // Logic below is the following:
         //
         // If we are over a scrollable div or not over the map div:
         //  * do nothing (let the browser handle scrolling)
         //
-        //    otherwise 
-        // 
-        //    If we are over the layer div: 
+        //    otherwise
+        //
+        //    If we are over the layer div:
         //     * zoom/in out
         //     then
         //     * kill event (so as not to also scroll the page after zooming)
         //
         //       otherwise
         //
-        //       Kill the event (dont scroll the page if we wheel over the 
+        //       Kill the event (dont scroll the page if we wheel over the
         //        layerswitcher or the pan/zoom control)
         //
         if (!overScrollableDiv && overMapDiv) {
@@ -20202,18 +20202,18 @@
      * Method: wheelZoom
      * Given the wheel event, we carry out the appropriate zooming in or out,
      *     based on the 'wheelDelta' or 'detail' property of the event.
-     * 
+     *
      * Parameters:
      * e - {Event}
      */
     wheelZoom: function(e) {
-        
+
         var delta = 0;
         if (!e) {
             e = window.event;
         }
         if (e.wheelDelta) {
-            delta = e.wheelDelta/120; 
+            delta = e.wheelDelta/120;
             if (window.opera && window.opera.version() < 9.2) {
                 delta = -delta;
             }
@@ -20221,18 +20221,18 @@
             delta = -e.detail / 3;
         }
         if (delta) {
-            // add the mouse position to the event because mozilla has 
-            // a bug with clientX and clientY (see 
+            // add the mouse position to the event because mozilla has
+            // a bug with clientX and clientY (see
             // https://bugzilla.mozilla.org/show_bug.cgi?id=352179)
             // getLonLatFromViewPortPx(e) returns wrong values
             if (this.mousePosition) {
                 e.xy = this.mousePosition;
-            } 
+            }
             if (!e.xy) {
                 // If the mouse hasn't moved over the map yet, then
                 // we don't have a mouse position (in FF), so we just
                 // act as if the mouse was at the center of the map.
-                // Note that we can tell we are in the map -- and 
+                // Note that we can tell we are in the map -- and
                 // this.map is ensured to be true above.
                 e.xy = this.map.getPixelFromLonLat(
                     this.map.getCenter()
@@ -20245,15 +20245,15 @@
             }
         }
     },
-    
+
     /**
      * Method: mousemove
      * Update the stored mousePosition on every move.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
@@ -20261,7 +20261,7 @@
     },
 
     /**
-     * Method: activate 
+     * Method: activate
      */
     activate: function (evt) {
         if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
@@ -20277,7 +20277,7 @@
     },
 
     /**
-     * Method: deactivate 
+     * Method: deactivate
      */
     deactivate: function (evt) {
         if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
@@ -20319,13 +20319,13 @@
      */
     id: null,
 
-    /** 
+    /**
      * APIProperty: name
      * {String}
      */
     name: null,
 
-    /** 
+    /**
      * APIProperty: div
      * {DOMElement}
      */
@@ -20339,20 +20339,20 @@
 
     /**
      * APIProperty: alwaysInRange
-     * {Boolean} If a layer's display should not be scale-based, this should 
-     *     be set to true. This will cause the layer, as an overlay, to always 
-     *     be 'active', by always returning true from the calculateInRange() 
-     *     function. 
-     * 
-     *     If not explicitly specified for a layer, its value will be 
-     *     determined on startup in initResolutions() based on whether or not 
-     *     any scale-specific properties have been set as options on the 
-     *     layer. If no scale-specific options have been set on the layer, we 
+     * {Boolean} If a layer's display should not be scale-based, this should
+     *     be set to true. This will cause the layer, as an overlay, to always
+     *     be 'active', by always returning true from the calculateInRange()
+     *     function.
+     *
+     *     If not explicitly specified for a layer, its value will be
+     *     determined on startup in initResolutions() based on whether or not
+     *     any scale-specific properties have been set as options on the
+     *     layer. If no scale-specific options have been set on the layer, we
      *     assume that it should always be in range.
-     * 
+     *
      *     See #987 for more info.
      */
-    alwaysInRange: null,   
+    alwaysInRange: null,
 
     /**
      * Constant: EVENT_TYPES
@@ -20382,7 +20382,7 @@
      */
     EVENT_TYPES: ["loadstart", "loadend", "loadcancel", "visibilitychanged",
                   "move", "moveend"],
-        
+
     /**
      * APIProperty: events
      * {<OpenLayers.Events>}
@@ -20391,25 +20391,25 @@
 
     /**
      * APIProperty: map
-     * {<OpenLayers.Map>} This variable is set when the layer is added to 
+     * {<OpenLayers.Map>} This variable is set when the layer is added to
      *     the map, via the accessor function setMap().
      */
     map: null,
-    
+
     /**
      * APIProperty: isBaseLayer
-     * {Boolean} Whether or not the layer is a base layer. This should be set 
+     * {Boolean} Whether or not the layer is a base layer. This should be set
      *     individually by all subclasses. Default is false
      */
     isBaseLayer: false,
- 
+
     /**
      * Property: alpha
-     * {Boolean} The layer's images have an alpha channel.  Default is false. 
+     * {Boolean} The layer's images have an alpha channel.  Default is false.
      */
     alpha: false,
 
-    /** 
+    /**
      * APIProperty: displayInLayerSwitcher
      * {Boolean} Display the layer's name in the layer switcher.  Default is
      *     true.
@@ -20424,36 +20424,36 @@
 
     /**
      * APIProperty: attribution
-     * {String} Attribution string, displayed when an 
+     * {String} Attribution string, displayed when an
      *     <OpenLayers.Control.Attribution> has been added to the map.
      */
-    attribution: null, 
+    attribution: null,
 
-    /** 
+    /**
      * Property: inRange
-     * {Boolean} The current map resolution is within the layer's min/max 
-     *     range. This is set in <OpenLayers.Map.setCenter> whenever the zoom 
+     * {Boolean} The current map resolution is within the layer's min/max
+     *     range. This is set in <OpenLayers.Map.setCenter> whenever the zoom
      *     changes.
      */
     inRange: false,
-    
+
     /**
      * Propery: imageSize
-     * {<OpenLayers.Size>} For layers with a gutter, the image is larger than 
+     * {<OpenLayers.Size>} For layers with a gutter, the image is larger than
      *     the tile by twice the gutter in each dimension.
      */
     imageSize: null,
-    
+
     /**
      * Property: imageOffset
-     * {<OpenLayers.Pixel>} For layers with a gutter, the image offset 
+     * {<OpenLayers.Pixel>} For layers with a gutter, the image offset
      *     represents displacement due to the gutter.
      */
     imageOffset: null,
 
   // OPTIONS
 
-    /** 
+    /**
      * Property: options
      * {Object} An optional object whose properties will be set on the layer.
      *     Any of the layer properties can be set as a property of the options
@@ -20479,8 +20479,8 @@
      *     at tile edges to be ignored.  Set a gutter value that is equal to
      *     half the size of the widest symbol that needs to be displayed.
      *     Defaults to zero.  Non-tiled layers always have zero gutter.
-     */ 
-    gutter: 0, 
+     */
+    gutter: 0,
 
     /**
      * APIProperty: projection
@@ -20488,10 +20488,10 @@
      *     override the default projection string this layer - also set maxExtent,
      *     maxResolution, and units if appropriate. Can be either a string or
      *     an <OpenLayers.Projection> object when created -- will be converted
-     *     to an object when setMap is called if a string is passed.  
+     *     to an object when setMap is called if a string is passed.
      */
-    projection: null,    
-    
+    projection: null,
+
     /**
      * APIProperty: units
      * {String} The layer map units.  Defaults to 'degrees'.  Possible values
@@ -20518,7 +20518,7 @@
      *     maxResolution, maxScale, etc.).
      */
     resolutions: null,
-    
+
     /**
      * APIProperty: maxExtent
      * {<OpenLayers.Bounds>}  The center of these bounds will not stray outside
@@ -20527,18 +20527,18 @@
      *     requested that falls completely outside of these bounds.
      */
     maxExtent: null,
-    
+
     /**
      * APIProperty: minExtent
      * {<OpenLayers.Bounds>}
      */
     minExtent: null,
-    
+
     /**
      * APIProperty: maxResolution
      * {Float} Default max is 360 deg / 256 px, which corresponds to
-     *     zoom level 0 on gmaps.  Specify a different value in the layer 
-     *     options if you are not using a geographic projection and 
+     *     zoom level 0 on gmaps.  Specify a different value in the layer
+     *     options if you are not using a geographic projection and
      *     displaying the whole world.
      */
     maxResolution: null,
@@ -20554,13 +20554,13 @@
      * {Integer}
      */
     numZoomLevels: null,
-   
+
     /**
      * APIProperty: minScale
      * {Float}
      */
     minScale: null,
-    
+
     /**
      * APIProperty: maxScale
      * {Float}
@@ -20569,21 +20569,21 @@
 
     /**
      * APIProperty: displayOutsideMaxExtent
-     * {Boolean} Request map tiles that are completely outside of the max 
+     * {Boolean} Request map tiles that are completely outside of the max
      *     extent for this layer. Defaults to false.
      */
     displayOutsideMaxExtent: false,
 
     /**
      * APIProperty: wrapDateLine
-     * {Boolean} #487 for more info.   
+     * {Boolean} #487 for more info.
      */
     wrapDateLine: false,
-    
+
     /**
      * APIProperty: transitionEffect
      * {String} The transition effect to use when the map is panned or
-     *     zoomed.  
+     *     zoomed.
      *
      * There are currently two supported values:
      *  - *null* No transition effect (the default).
@@ -20593,14 +20593,14 @@
      *    resized tiles.
      */
     transitionEffect: null,
-    
+
     /**
      * Property: SUPPORTED_TRANSITIONS
-     * {Array} An immutable (that means don't change it!) list of supported 
+     * {Array} An immutable (that means don't change it!) list of supported
      *     transitionEffect values.
      */
     SUPPORTED_TRANSITIONS: ['resize'],
-    
+
     /**
      * Constructor: OpenLayers.Layer
      *
@@ -20613,7 +20613,7 @@
         this.addOptions(options);
 
         this.name = name;
-        
+
         if (this.id == null) {
 
             this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
@@ -20623,7 +20623,7 @@
             this.div.style.height = "100%";
             this.div.dir = "ltr";
 
-            this.events = new OpenLayers.Events(this, this.div, 
+            this.events = new OpenLayers.Events(this, this.div,
                                                 this.EVENT_TYPES);
             if(this.eventListeners instanceof Object) {
                 this.events.on(this.eventListeners);
@@ -20635,7 +20635,7 @@
             this.displayOutsideMaxExtent = true;
         }
     },
-    
+
     /**
      * Method: destroy
      * Destroy is a destructor: this is to alleviate cyclic references which
@@ -20667,7 +20667,7 @@
         this.eventListeners = null;
         this.events = null;
     },
-    
+
    /**
     * Method: clone
     *
@@ -20678,22 +20678,22 @@
     * {<OpenLayers.Layer>} An exact clone of this <OpenLayers.Layer>
     */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer(this.name, this.options);
-        } 
-        
+        }
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(obj, this);
-        
+
         // a cloned layer should never have its map property set
-        //  because it has not been added to a map yet. 
+        //  because it has not been added to a map yet.
         obj.map = null;
-        
+
         return obj;
     },
-    
-    /** 
+
+    /**
      * APIMethod: setName
      * Sets the new layer name for this layer.  Can trigger a changelayer event
      *     on the map.
@@ -20711,33 +20711,33 @@
                 });
             }
         }
-    },    
-    
+    },
+
    /**
     * APIMethod: addOptions
-    * 
+    *
     * Parameters:
     * newOptions - {Object}
     */
     addOptions: function (newOptions) {
-        
+
         if (this.options == null) {
             this.options = {};
         }
-        
+
         // update our copy for clone
         OpenLayers.Util.extend(this.options, newOptions);
 
         // add new options to this
         OpenLayers.Util.extend(this, newOptions);
     },
-    
+
     /**
      * APIMethod: onMapResize
      * This function can be implemented by subclasses
      */
     onMapResize: function() {
-        //this function can be implemented by subclasses  
+        //this function can be implemented by subclasses
     },
 
     /**
@@ -20770,7 +20770,7 @@
 
     /**
      * Method: moveTo
-     * 
+     *
      * Parameters:
      * bound - {<OpenLayers.Bounds>}
      * zoomChanged - {Boolean} Tells when zoom has changed, as layers have to
@@ -20788,47 +20788,47 @@
     /**
      * Method: setMap
      * Set the map property for the layer. This is done through an accessor
-     *     so that subclasses can override this and take special action once 
-     *     they have their map variable set. 
-     * 
-     *     Here we take care to bring over any of the necessary default 
-     *     properties from the map. 
-     * 
+     *     so that subclasses can override this and take special action once
+     *     they have their map variable set.
+     *
+     *     Here we take care to bring over any of the necessary default
+     *     properties from the map.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         if (this.map == null) {
-        
+
             this.map = map;
-            
+
             // grab some essential layer data from the map if it hasn't already
             //  been set
             this.maxExtent = this.maxExtent || this.map.maxExtent;
             this.projection = this.projection || this.map.projection;
-            
+
             if (this.projection && typeof this.projection == "string") {
                 this.projection = new OpenLayers.Projection(this.projection);
             }
-            
+
             // Check the projection to see if we can get units -- if not, refer
             // to properties.
             this.units = this.projection.getUnits() ||
                          this.units || this.map.units;
-            
+
             this.initResolutions();
-            
+
             if (!this.isBaseLayer) {
                 this.inRange = this.calculateInRange();
                 var show = ((this.visibility) && (this.inRange));
                 this.div.style.display = show ? "" : "none";
             }
-            
+
             // deal with gutters
             this.setTileSize();
         }
     },
-    
+
     /**
      * Method: afterAdd
      * Called at the end of the map.addLayer sequence.  At this point, the map
@@ -20836,39 +20836,39 @@
      */
     afterAdd: function() {
     },
-    
+
     /**
      * APIMethod: removeMap
-     * Just as setMap() allows each layer the possibility to take a 
+     * Just as setMap() allows each layer the possibility to take a
      *     personalized action on being added to the map, removeMap() allows
-     *     each layer to take a personalized action on being removed from it. 
+     *     each layer to take a personalized action on being removed from it.
      *     For now, this will be mostly unused, except for the EventPane layer,
      *     which needs this hook so that it can remove the special invisible
-     *     pane. 
-     * 
+     *     pane.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     removeMap: function(map) {
         //to be overridden by subclasses
     },
-    
+
     /**
      * APIMethod: getImageSize
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Size>} The size that the image should be, taking into 
+     * {<OpenLayers.Size>} The size that the image should be, taking into
      *     account gutters.
-     */ 
-    getImageSize: function() { 
-        return (this.imageSize || this.tileSize); 
-    },    
-  
+     */
+    getImageSize: function() {
+        return (this.imageSize || this.tileSize);
+    },
+
     /**
      * APIMethod: setTileSize
      * Set the tile size based on the map size.  This also sets layer.imageSize
      *     and layer.imageOffset for use by Tile.Image.
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>}
      */
@@ -20884,16 +20884,16 @@
           //                              this.name + ": layers with " +
           //                              "gutters need non-null tile sizes");
           //}
-            this.imageOffset = new OpenLayers.Pixel(-this.gutter, 
-                                                    -this.gutter); 
-            this.imageSize = new OpenLayers.Size(tileSize.w + (2*this.gutter), 
-                                                 tileSize.h + (2*this.gutter)); 
+            this.imageOffset = new OpenLayers.Pixel(-this.gutter,
+                                                    -this.gutter);
+            this.imageSize = new OpenLayers.Size(tileSize.w + (2*this.gutter),
+                                                 tileSize.h + (2*this.gutter));
         }
     },
 
     /**
      * APIMethod: getVisibility
-     * 
+     *
      * Returns:
      * {Boolean} The layer should be displayed (if in range).
      */
@@ -20901,18 +20901,18 @@
         return this.visibility;
     },
 
-    /** 
+    /**
      * APIMethod: setVisibility
-     * Set the visibility flag for the layer and hide/show & redraw 
+     * Set the visibility flag for the layer and hide/show & redraw
      *     accordingly. Fire event unless otherwise specified
-     * 
+     *
      * Note that visibility is no longer simply whether or not the layer's
-     *     style.display is set to "block". Now we store a 'visibility' state 
-     *     property on the layer class, this allows us to remember whether or 
-     *     not we *desire* for a layer to be visible. In the case where the 
-     *     map's resolution is out of the layer's range, this desire may be 
+     *     style.display is set to "block". Now we store a 'visibility' state
+     *     property on the layer class, this allows us to remember whether or
+     *     not we *desire* for a layer to be visible. In the case where the
+     *     map's resolution is out of the layer's range, this desire may be
      *     subverted.
-     * 
+     *
      * Parameters:
      * visible - {Boolean} Whether or not to display the layer (if in range)
      */
@@ -20931,10 +20931,10 @@
         }
     },
 
-    /** 
+    /**
      * APIMethod: display
      * Hide or show the Layer
-     * 
+     *
      * Parameters:
      * display - {Boolean}
      */
@@ -20947,10 +20947,10 @@
 
     /**
      * APIMethod: calculateInRange
-     * 
+     *
      * Returns:
      * {Boolean} The layer is displayable at the current map's current
-     *     resolution. Note that if 'alwaysInRange' is true for the layer, 
+     *     resolution. Note that if 'alwaysInRange' is true for the layer,
      *     this function will always return true.
      */
     calculateInRange: function() {
@@ -20968,9 +20968,9 @@
         return inRange;
     },
 
-    /** 
+    /**
      * APIMethod: setIsBaseLayer
-     * 
+     *
      * Parameters:
      * isBaseLayer - {Boolean}
      */
@@ -20990,73 +20990,73 @@
   /*                 Baselayer Functions                  */
   /*                                                      */
   /********************************************************/
-  
-    /** 
+
+    /**
      * Method: initResolutions
-     * This method's responsibility is to set up the 'resolutions' array 
+     * This method's responsibility is to set up the 'resolutions' array
      *     for the layer -- this array is what the layer will use to interface
-     *     between the zoom levels of the map and the resolution display 
+     *     between the zoom levels of the map and the resolution display
      *     of the layer.
-     * 
+     *
      * The user has several options that determine how the array is set up.
-     *  
-     * For a detailed explanation, see the following wiki from the 
+     *
+     * For a detailed explanation, see the following wiki from the
      *     openlayers.org homepage:
      *     http://trac.openlayers.org/wiki/SettingZoomLevels
      */
     initResolutions: function() {
 
-        // These are the relevant options which are used for calculating 
+        // These are the relevant options which are used for calculating
         //  resolutions information.
         //
         var props = new Array(
           'projection', 'units',
           'scales', 'resolutions',
-          'maxScale', 'minScale', 
-          'maxResolution', 'minResolution', 
+          'maxScale', 'minScale',
+          'maxResolution', 'minResolution',
           'minExtent', 'maxExtent',
           'numZoomLevels', 'maxZoomLevel'
         );
 
-        //these are the properties which do *not* imply that user wishes 
+        //these are the properties which do *not* imply that user wishes
         // this layer to be scale-dependant
-        var notScaleProps = ['projection', 'units'];    
+        var notScaleProps = ['projection', 'units'];
 
-        //should the layer be scale-dependant? default is false -- this will 
+        //should the layer be scale-dependant? default is false -- this will
         // only be set true if we find that the user has specified a property
         // from the 'props' array that is not in 'notScaleProps'
         var useInRange = false;
 
-        // First we create a new object where we will store all of the 
+        // First we create a new object where we will store all of the
         //  resolution-related properties that we find in either the layer's
         //  'options' array or from the map.
         //
-        var confProps = {};        
+        var confProps = {};
         for(var i=0, len=props.length; i<len; i++) {
             var property = props[i];
-            
-            // If the layer had one of these properties set *and* it is 
+
+            // If the layer had one of these properties set *and* it is
             // a scale property (is not a non-scale property), then we assume
             // the user did intend to use scale-dependant display (useInRange).
-            if (this.options[property] && 
+            if (this.options[property] &&
                 OpenLayers.Util.indexOf(notScaleProps, property) == -1) {
                 useInRange = true;
             }
-                   
+
             confProps[property] = this.options[property] || this.map[property];
         }
 
-        //only automatically set 'alwaysInRange' if the user hasn't already 
+        //only automatically set 'alwaysInRange' if the user hasn't already
         // set it (to true or false, since the default is null). If user did
         // not intend to use scale-dependant display then we set they layer
-        // as alwaysInRange. This means calculateInRange() will always return 
+        // as alwaysInRange. This means calculateInRange() will always return
         // true and the layer will never be turned off due to scale changes.
         //
         if (this.alwaysInRange == null) {
             this.alwaysInRange = !useInRange;
         }
 
-        // Do not use the scales array set at the map level if 
+        // Do not use the scales array set at the map level if
         // either minScale or maxScale or both are set at the
         // layer level
         if ((this.options.minScale != null ||
@@ -21065,7 +21065,7 @@
 
             confProps.scales = null;
         }
-        // Do not use the resolutions array set at the map level if 
+        // Do not use the resolutions array set at the map level if
         // either minResolution or maxResolution or both are set at the
         // layer level
         if ((this.options.minResolution != null ||
@@ -21075,14 +21075,14 @@
             confProps.resolutions = null;
         }
 
-        // If numZoomLevels hasn't been set and the maxZoomLevel *has*, 
+        // If numZoomLevels hasn't been set and the maxZoomLevel *has*,
         //  then use maxZoomLevel to calculate numZoomLevels
         //
         if ( (!confProps.numZoomLevels) && (confProps.maxZoomLevel) ) {
             confProps.numZoomLevels = confProps.maxZoomLevel + 1;
         }
 
-        // First off, we take whatever hodge-podge of values we have and 
+        // First off, we take whatever hodge-podge of values we have and
         //  calculate/distill them down into a resolutions[] array
         //
         if ((confProps.scales != null) || (confProps.resolutions != null)) {
@@ -21091,8 +21091,8 @@
                 confProps.resolutions = [];
                 for(var i=0, len=confProps.scales.length; i<len; i++) {
                     var scale = confProps.scales[i];
-                    confProps.resolutions[i] = 
-                       OpenLayers.Util.getResolutionFromScale(scale, 
+                    confProps.resolutions[i] =
+                       OpenLayers.Util.getResolutionFromScale(scale,
                                                               confProps.units);
                 }
             }
@@ -21103,39 +21103,39 @@
 
             // determine maxResolution
             if (confProps.minScale) {
-                confProps.maxResolution = 
-                    OpenLayers.Util.getResolutionFromScale(confProps.minScale, 
+                confProps.maxResolution =
+                    OpenLayers.Util.getResolutionFromScale(confProps.minScale,
                                                            confProps.units);
             } else if (confProps.maxResolution == "auto") {
                 var viewSize = this.map.getSize();
                 var wRes = confProps.maxExtent.getWidth() / viewSize.w;
                 var hRes = confProps.maxExtent.getHeight()/ viewSize.h;
                 confProps.maxResolution = Math.max(wRes, hRes);
-            } 
+            }
 
             // determine minResolution
-            if (confProps.maxScale != null) {           
-                confProps.minResolution = 
-                    OpenLayers.Util.getResolutionFromScale(confProps.maxScale, 
+            if (confProps.maxScale != null) {
+                confProps.minResolution =
+                    OpenLayers.Util.getResolutionFromScale(confProps.maxScale,
                                                            confProps.units);
-            } else if ( (confProps.minResolution == "auto") && 
+            } else if ( (confProps.minResolution == "auto") &&
                         (confProps.minExtent != null) ) {
                 var viewSize = this.map.getSize();
                 var wRes = confProps.minExtent.getWidth() / viewSize.w;
                 var hRes = confProps.minExtent.getHeight()/ viewSize.h;
                 confProps.minResolution = Math.max(wRes, hRes);
-            } 
+            }
 
             // determine numZoomLevels if not already set on the layer
             // this gives numZoomLevels assuming approximately base 2 scaling
             if (confProps.minResolution != null &&
                 this.options.numZoomLevels == undefined) {
                 var ratio = confProps.maxResolution / confProps.minResolution;
-                confProps.numZoomLevels = 
+                confProps.numZoomLevels =
                     Math.floor(Math.log(ratio) / Math.log(2)) + 1;
             }
-            
-            // now we have numZoomLevels and maxResolution, 
+
+            // now we have numZoomLevels and maxResolution,
             //  we can populate the resolutions array
             confProps.resolutions = new Array(confProps.numZoomLevels);
             var base = 2;
@@ -21157,15 +21157,15 @@
                 confProps.resolutions[i] = res;
             }
         }
-        
+
         //sort resolutions array ascendingly
         //
         confProps.resolutions.sort( function(a, b) { return(b-a); } );
 
-        // now set our newly calculated values back to the layer 
-        //  Note: We specifically do *not* set them to layer.options, which we 
-        //        will preserve as it was when we added this layer to the map. 
-        //        this way cloned layers reset themselves to new map div 
+        // now set our newly calculated values back to the layer
+        //  Note: We specifically do *not* set them to layer.options, which we
+        //        will preserve as it was when we added this layer to the map.
+        //        this way cloned layers reset themselves to new map div
         //        dimensions)
         //
 
@@ -21173,22 +21173,22 @@
         this.maxResolution = confProps.resolutions[0];
         var lastIndex = confProps.resolutions.length - 1;
         this.minResolution = confProps.resolutions[lastIndex];
-        
+
         this.scales = [];
         for(var i=0, len=confProps.resolutions.length; i<len; i++) {
-            this.scales[i] = 
-               OpenLayers.Util.getScaleFromResolution(confProps.resolutions[i], 
+            this.scales[i] =
+               OpenLayers.Util.getScaleFromResolution(confProps.resolutions[i],
                                                       confProps.units);
         }
         this.minScale = this.scales[0];
         this.maxScale = this.scales[this.scales.length - 1];
-        
+
         this.numZoomLevels = confProps.numZoomLevels;
     },
 
     /**
      * APIMethod: getResolution
-     * 
+     *
      * Returns:
      * {Float} The currently selected resolution of the map, taken from the
      *     resolutions array, indexed by current zoom level.
@@ -21198,11 +21198,11 @@
         return this.getResolutionForZoom(zoom);
     },
 
-    /** 
+    /**
      * APIMethod: getExtent
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
      *     bounds of the current viewPort.
      */
     getExtent: function() {
@@ -21214,18 +21214,18 @@
 
     /**
      * APIMethod: getZoomForExtent
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     * closest - {Boolean} Find the zoom level that most closely fits the 
-     *     specified bounds. Note that this may result in a zoom that does 
+     * closest - {Boolean} Find the zoom level that most closely fits the
+     *     specified bounds. Note that this may result in a zoom that does
      *     not exactly contain the entire extent.
      *     Default is false.
      *
      * Returns:
-     * {Integer} The index of the zoomLevel (entry in the resolutions array) 
-     *     for the passed-in extent. We do this by calculating the ideal 
-     *     resolution for the given extent (based on the map size) and then 
+     * {Integer} The index of the zoomLevel (entry in the resolutions array)
+     *     for the passed-in extent. We do this by calculating the ideal
+     *     resolution for the given extent (based on the map size) and then
      *     calling getZoomForResolution(), passing along the 'closest'
      *     parameter.
      */
@@ -21236,12 +21236,12 @@
 
         return this.getZoomForResolution(idealResolution, closest);
     },
-    
-    /** 
+
+    /**
      * Method: getDataExtent
      * Calculates the max extent which includes all of the data for the layer.
      *     This function is to be implemented by subclasses.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -21251,10 +21251,10 @@
 
     /**
      * APIMethod: getResolutionForZoom
-     * 
+     *
      * Parameter:
      * zoom - {Float}
-     * 
+     *
      * Returns:
      * {Float} A suitable resolution for the specified zoom.
      */
@@ -21274,20 +21274,20 @@
 
     /**
      * APIMethod: getZoomForResolution
-     * 
+     *
      * Parameters:
      * resolution - {Float}
-     * closest - {Boolean} Find the zoom level that corresponds to the absolute 
+     * closest - {Boolean} Find the zoom level that corresponds to the absolute
      *     closest resolution, which may result in a zoom whose corresponding
      *     resolution is actually smaller than we would have desired (if this
      *     is being called from a getZoomForExtent() call, then this means that
-     *     the returned zoom index might not actually contain the entire 
+     *     the returned zoom index might not actually contain the entire
      *     extent specified... but it'll be close).
      *     Default is false.
-     * 
+     *
      * Returns:
-     * {Integer} The index of the zoomLevel (entry in the resolutions array) 
-     *     that corresponds to the best fit resolution given the passed in 
+     * {Integer} The index of the zoomLevel (entry in the resolutions array)
+     *     that corresponds to the best fit resolution given the passed in
      *     value and the 'closest' specification.
      */
     getZoomForResolution: function(resolution, closest) {
@@ -21319,7 +21319,7 @@
         } else {
             var diff;
             var minDiff = Number.POSITIVE_INFINITY;
-            for(var i=0, len=this.resolutions.length; i<len; i++) {            
+            for(var i=0, len=this.resolutions.length; i<len; i++) {
                 if (closest) {
                     diff = Math.abs(this.resolutions[i] - resolution);
                     if (diff > minDiff) {
@@ -21336,15 +21336,15 @@
         }
         return zoom;
     },
-    
+
     /**
      * APIMethod: getLonLatFromViewPortPx
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
      *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in
      *     view port <OpenLayers.Pixel>, translated into lon/lat by the layer.
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
@@ -21354,12 +21354,12 @@
             var center = this.map.getCenter();
             if (center) {
                 var res  = this.map.getResolution();
-        
+
                 var delta_x = viewPortPx.x - (size.w / 2);
                 var delta_y = viewPortPx.y - (size.h / 2);
-            
+
                 lonlat = new OpenLayers.LonLat(center.lon + delta_x * res ,
-                                             center.lat - delta_y * res); 
+                                             center.lat - delta_y * res);
 
                 if (this.wrapDateLine) {
                     lonlat = lonlat.wrapDateLine(this.maxExtent);
@@ -21373,31 +21373,31 @@
      * APIMethod: getViewPortPxFromLonLat
      * Returns a pixel location given a map location.  This method will return
      *     fractional pixel values.
-     * 
+     *
      * Parameters:
      * lonlat - {<OpenLayers.LonLat>}
      *
-     * Returns: 
-     * {<OpenLayers.Pixel>} An <OpenLayers.Pixel> which is the passed-in 
+     * Returns:
+     * {<OpenLayers.Pixel>} An <OpenLayers.Pixel> which is the passed-in
      *     <OpenLayers.LonLat>,translated into view port pixels.
      */
     getViewPortPxFromLonLat: function (lonlat) {
-        var px = null; 
+        var px = null;
         if (lonlat != null) {
             var resolution = this.map.getResolution();
             var extent = this.map.getExtent();
             px = new OpenLayers.Pixel(
                 (1/resolution * (lonlat.lon - extent.left)),
                 (1/resolution * (extent.top - lonlat.lat))
-            );    
+            );
         }
         return px;
     },
-    
+
     /**
      * APIMethod: setOpacity
      * Sets the opacity for the entire layer (all images)
-     * 
+     *
      * Parameter:
      * opacity - {Float}
      */
@@ -21406,7 +21406,7 @@
             this.opacity = opacity;
             for(var i=0, len=this.div.childNodes.length; i<len; ++i) {
                 var element = this.div.childNodes[i].firstChild;
-                OpenLayers.Util.modifyDOMElement(element, null, null, null, 
+                OpenLayers.Util.modifyDOMElement(element, null, null, null,
                                                  null, null, null, opacity);
             }
         }
@@ -21414,20 +21414,20 @@
 
     /**
      * Method: getZIndex
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Integer} the z-index of this layer
-     */    
+     */
     getZIndex: function () {
         return this.div.style.zIndex;
     },
 
     /**
      * Method: setZIndex
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * zIndex - {Integer}
-     */    
+     */
     setZIndex: function (zIndex) {
         this.div.style.zIndex = zIndex;
     },
@@ -21435,18 +21435,18 @@
     /**
      * Method: adjustBounds
      * This function will take a bounds, and if wrapDateLine option is set
-     *     on the layer, it will return a bounds which is wrapped around the 
-     *     world. We do not wrap for bounds which *cross* the 
-     *     maxExtent.left/right, only bounds which are entirely to the left 
+     *     on the layer, it will return a bounds which is wrapped around the
+     *     world. We do not wrap for bounds which *cross* the
+     *     maxExtent.left/right, only bounds which are entirely to the left
      *     or entirely to the right.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     adjustBounds: function (bounds) {
 
         if (this.gutter) {
-            // Adjust the extent of a bounds in map units by the 
+            // Adjust the extent of a bounds in map units by the
             // layer's gutter in pixels.
             var mapGutter = this.gutter * this.map.getResolution();
             bounds = new OpenLayers.Bounds(bounds.left - mapGutter,
@@ -21457,11 +21457,11 @@
 
         if (this.wrapDateLine) {
             // wrap around the date line, within the limits of rounding error
-            var wrappingOptions = { 
+            var wrappingOptions = {
                 'rightTolerance':this.getResolution()
-            };    
+            };
             bounds = bounds.wrapDateLine(this.maxExtent, wrappingOptions);
-                              
+
         }
         return bounds;
     },
@@ -21485,29 +21485,29 @@
  * Class: OpenLayers.Marker.Box
  *
  * Inherits from:
- *  - <OpenLayers.Marker> 
+ *  - <OpenLayers.Marker>
  */
 OpenLayers.Marker.Box = OpenLayers.Class(OpenLayers.Marker, {
 
-    /** 
-     * Property: bounds 
-     * {<OpenLayers.Bounds>} 
+    /**
+     * Property: bounds
+     * {<OpenLayers.Bounds>}
      */
     bounds: null,
 
-    /** 
-     * Property: div 
-     * {DOMElement} 
+    /**
+     * Property: div
+     * {DOMElement}
      */
     div: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Marker.Box
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * borderColor - {String} 
-     * borderWidth - {int} 
+     * bounds - {<OpenLayers.Bounds>}
+     * borderColor - {String}
+     * borderWidth - {int}
      */
     initialize: function(bounds, borderColor, borderWidth) {
         this.bounds = bounds;
@@ -21518,8 +21518,8 @@
     },
 
     /**
-     * Method: destroy 
-     */    
+     * Method: destroy
+     */
     destroy: function() {
 
         this.bounds = null;
@@ -21528,10 +21528,10 @@
         OpenLayers.Marker.prototype.destroy.apply(this, arguments);
     },
 
-    /** 
+    /**
      * Method: setBorder
      * Allow the user to change the box's color and border width
-     * 
+     *
      * Parameters:
      * color - {String} Default is "red"
      * width - {int} Default is 2
@@ -21545,26 +21545,26 @@
         }
         this.div.style.border = width + "px solid " + color;
     },
-    
-    /** 
+
+    /**
     * Method: draw
-    * 
+    *
     * Parameters:
-    * px - {<OpenLayers.Pixel>} 
-    * sz - {<OpenLayers.Size>} 
-    * 
-    * Returns: 
-    * {DOMElement} A new DOM Image with this marker´s icon set at the 
+    * px - {<OpenLayers.Pixel>}
+    * sz - {<OpenLayers.Size>}
+    *
+    * Returns:
+    * {DOMElement} A new DOM Image with this marker´s icon set at the
     *         location passed-in
     */
     draw: function(px, sz) {
         OpenLayers.Util.modifyDOMElement(this.div, null, px, sz);
         return this.div;
-    }, 
+    },
 
     /**
      * Method: onScreen
-     * 
+     *
      * Rreturn:
      * {Boolean} Whether or not the marker is currently visible on screen.
      */
@@ -21573,16 +21573,16 @@
         if (this.map) {
             var screenBounds = this.map.getExtent();
             onScreen = screenBounds.containsBounds(this.bounds, true, true);
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: display
      * Hide or show the icon
-     * 
+     *
      * Parameters:
-     * display - {Boolean} 
+     * display - {Boolean}
      */
     display: function(display) {
         this.div.style.display = (display) ? "" : "none";
@@ -21930,19 +21930,19 @@
  *  @uri url to do remote XML http get
  *  @param {String} 'get' format params (x=y&a=b...)
  *  @who object to handle callbacks for this request
- *  @complete  the function to be called on success 
+ *  @complete  the function to be called on success
  *  @failure  the function to be called on failure
- *  
+ *
  *   example usage from a caller:
- *  
+ *
  *     caps: function(request) {
- *      -blah-  
+ *      -blah-
  *     },
- *  
+ *
  *     OpenLayers.loadURL(url,params,this,caps);
  *
  * Notice the above example does not provide an error handler; a default empty
- * handler is provided which merely logs the error if a failure handler is not 
+ * handler is provided which merely logs the error if a failure handler is not
  * supplied
  *
  */
@@ -21956,7 +21956,7 @@
     OpenLayers.Console.userError(OpenLayers.i18n("unhandledRequest", {'statusText':request.statusText}));
 };
 
-/** 
+/**
  * APIFunction: loadURL
  * Background load a document.  For more flexibility in using XMLHttpRequest,
  *     see the <OpenLayers.Request> methods.
@@ -21970,7 +21970,7 @@
  * onComplete - {Function} Optional callback for success.  The callback
  *     will be called with this set to caller and will receive the request
  *     object as an argument.  Note that if you do not specify an onComplete
- *     function, <OpenLayers.nullHandler> will be called (which pops up a 
+ *     function, <OpenLayers.nullHandler> will be called (which pops up a
  *     user friendly error message dialog).
  * onFailure - {Function} Optional callback for failure.  In the event of
  *     a failure, the callback will be called with this set to caller and will
@@ -21984,26 +21984,26 @@
  */
 OpenLayers.loadURL = function(uri, params, caller,
                                   onComplete, onFailure) {
-    
+
     if(typeof params == 'string') {
         params = OpenLayers.Util.getParameters(params);
     }
     var success = (onComplete) ? onComplete : OpenLayers.nullHandler;
     var failure = (onFailure) ? onFailure : OpenLayers.nullHandler;
-    
+
     return OpenLayers.Request.GET({
         url: uri, params: params,
         success: success, failure: failure, scope: caller
     });
 };
 
-/** 
+/**
  * Function: parseXMLString
  * Parse XML into a doc structure
- * 
+ *
  * Parameters:
- * text - {String} 
- * 
+ * text - {String}
+ *
  * Returns:
  * {?} Parsed AJAX Responsev
  */
@@ -22052,8 +22052,8 @@
 
     /**
      * Method: getTransport
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} Transport mechanism for whichever browser we're in, or false if
      *          none available.
      */
@@ -22077,7 +22077,7 @@
  * {Object}
  */
 OpenLayers.Ajax.Responders = {
-  
+
     /**
      * Property: responders
      * {Array}
@@ -22086,7 +22086,7 @@
 
     /**
      * Method: register
-     *  
+     *
      * Parameters:
      * responderToAdd - {?}
      */
@@ -22101,7 +22101,7 @@
 
     /**
      * Method: unregister
-     *  
+     *
      * Parameters:
      * responderToRemove - {?}
      */
@@ -22111,7 +22111,7 @@
 
     /**
      * Method: dispatch
-     * 
+     *
      * Parameters:
      * callback - {?}
      * request - {?}
@@ -22121,11 +22121,11 @@
         var responder;
         for (var i = 0; i < this.responders.length; i++) {
             responder = this.responders[i];
-     
-            if (responder[callback] && 
+
+            if (responder[callback] &&
                 typeof responder[callback] == 'function') {
                 try {
-                    responder[callback].apply(responder, 
+                    responder[callback].apply(responder,
                                               [request, transport]);
                 } catch (e) {}
             }
@@ -22134,7 +22134,7 @@
 };
 
 OpenLayers.Ajax.Responders.register({
-    /** 
+    /**
      * Function: onCreate
      */
     onCreate: function() {
@@ -22153,11 +22153,11 @@
  * Class: OpenLayers.Ajax.Base
  */
 OpenLayers.Ajax.Base = OpenLayers.Class({
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Base
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * options - {Object}
      */
     initialize: function(options) {
@@ -22168,11 +22168,11 @@
             parameters:   ''
         };
         OpenLayers.Util.extend(this.options, options || {});
-        
+
         this.options.method = this.options.method.toLowerCase();
-        
+
         if (typeof this.options.parameters == 'string') {
-            this.options.parameters = 
+            this.options.parameters =
                 OpenLayers.Util.getParameters(this.options.parameters);
         }
     }
@@ -22193,28 +22193,28 @@
      * {Boolean}
      */
     _complete: false,
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Request
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * url - {String}
      * options - {Object}
      */
     initialize: function(url, options) {
         OpenLayers.Ajax.Base.prototype.initialize.apply(this, [options]);
-        
+
         if (OpenLayers.ProxyHost && OpenLayers.String.startsWith(url, "http")) {
             url = OpenLayers.ProxyHost + encodeURIComponent(url);
         }
-        
+
         this.transport = OpenLayers.Ajax.getTransport();
         this.request(url);
     },
 
     /**
      * Method: request
-     * 
+     *
      * Parameters:
      * url - {String}
      */
@@ -22222,15 +22222,15 @@
         this.url = url;
         this.method = this.options.method;
         var params = OpenLayers.Util.extend({}, this.options.parameters);
-        
+
         if (this.method != 'get' && this.method != 'post') {
             // simulate other verbs over post
             params['_method'] = this.method;
             this.method = 'post';
         }
 
-        this.parameters = params;        
-        
+        this.parameters = params;
+
         if (params = OpenLayers.Util.getParameterString(params)) {
             // when GET, append parameters to URL
             if (this.method == 'get') {
@@ -22244,31 +22244,31 @@
             if (this.options.onCreate) {
                 this.options.onCreate(response);
             }
-            
-            OpenLayers.Ajax.Responders.dispatch('onCreate', 
-                                                this, 
+
+            OpenLayers.Ajax.Responders.dispatch('onCreate',
+                                                this,
                                                 response);
-    
-            this.transport.open(this.method.toUpperCase(), 
+
+            this.transport.open(this.method.toUpperCase(),
                                 this.url,
                                 this.options.asynchronous);
-    
+
             if (this.options.asynchronous) {
                 window.setTimeout(
                     OpenLayers.Function.bind(this.respondToReadyState, this, 1),
                     10);
             }
-            
-            this.transport.onreadystatechange = 
-                OpenLayers.Function.bind(this.onStateChange, this);    
+
+            this.transport.onreadystatechange =
+                OpenLayers.Function.bind(this.onStateChange, this);
             this.setRequestHeaders();
-    
+
             this.body =  this.method == 'post' ?
                 (this.options.postBody || params) : null;
             this.transport.send(this.body);
-    
+
             // Force Firefox to handle ready state 4 for synchronous requests
-            if (!this.options.asynchronous && 
+            if (!this.options.asynchronous &&
                 this.transport.overrideMimeType) {
                 this.onStateChange();
             }
@@ -22286,7 +22286,7 @@
             this.respondToReadyState(this.transport.readyState);
         }
     },
-     
+
     /**
      * Method: setRequestHeaders
      */
@@ -22300,7 +22300,7 @@
         if (this.method == 'post') {
             headers['Content-type'] = this.options.contentType +
                 (this.options.encoding ? '; charset=' + this.options.encoding : '');
-    
+
             /* Force "Connection: close" for older Mozilla browsers to work
              * around a bug where XMLHttpRequest sends an incorrect
              * Content-length header. See Mozilla Bugzilla #246651.
@@ -22311,9 +22311,9 @@
             }
         }
         // user-defined headers
-        if (typeof this.options.requestHeaders == 'object') {    
+        if (typeof this.options.requestHeaders == 'object') {
             var extras = this.options.requestHeaders;
-            
+
             if (typeof extras.push == 'function') {
                 for (var i = 0, length = extras.length; i < length; i += 2) {
                     headers[extras[i]] = extras[i+1];
@@ -22324,23 +22324,23 @@
                 }
             }
         }
-        
+
         for (var name in headers) {
             this.transport.setRequestHeader(name, headers[name]);
         }
     },
-    
+
     /**
      * Method: success
      *
      * Returns:
-     * {Boolean} - 
+     * {Boolean} -
      */
     success: function() {
         var status = this.getStatus();
         return !status || (status >=200 && status < 300);
     },
-    
+
     /**
      * Method: getStatus
      *
@@ -22364,7 +22364,7 @@
     respondToReadyState: function(readyState) {
         var state = OpenLayers.Ajax.Request.Events[readyState];
         var response = new OpenLayers.Ajax.Response(this);
-    
+
         if (state == 'Complete') {
             try {
                 this._complete = true;
@@ -22374,29 +22374,29 @@
             } catch (e) {
                 this.dispatchException(e);
             }
-    
+
             var contentType = response.getHeader('Content-type');
         }
-    
+
         try {
-            (this.options['on' + state] || 
+            (this.options['on' + state] ||
              OpenLayers.Ajax.emptyFunction)(response);
-             OpenLayers.Ajax.Responders.dispatch('on' + state, 
-                                                 this, 
+             OpenLayers.Ajax.Responders.dispatch('on' + state,
+                                                 this,
                                                  response);
         } catch (e) {
             this.dispatchException(e);
         }
-    
+
         if (state == 'Complete') {
             // avoid memory leak in MSIE: clean up
             this.transport.onreadystatechange = OpenLayers.Ajax.emptyFunction;
         }
     },
-    
+
     /**
      * Method: getHeader
-     * 
+     *
      * Parameters:
      * name - {String} Header name
      *
@@ -22416,7 +22416,7 @@
      * If the optional onException function is set, execute it
      * and then dispatch the call to any other listener registered
      * for onException.
-     * 
+     *
      * If no optional onException function is set, we suspect that
      * the user may have also not used
      * OpenLayers.Ajax.Responders.register to register a listener
@@ -22428,7 +22428,7 @@
      * request.options.onException to an empty function (function(){})
      * or register an empty function with <OpenLayers.Ajax.Responders>
      * for onException.
-     * 
+     *
      * Parameters:
      * exception - {?}
      */
@@ -22459,7 +22459,7 @@
     }
 });
 
-/** 
+/**
  * Property: Events
  * {Array(String)}
  */
@@ -22477,26 +22477,26 @@
      * {Integer}
      */
     status: 0,
-    
 
+
     /**
      * Property: statusText
      *
      * {String}
      */
     statusText: '',
-      
+
     /**
      * Constructor: OpenLayers.Ajax.Response
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * request - {Object}
      */
     initialize: function(request) {
         this.request = request;
         var transport = this.transport = request.transport,
             readyState = this.readyState = transport.readyState;
-        
+
         if ((readyState > 2 &&
             !(!!(window.attachEvent && !window.opera))) ||
             readyState == 4) {
@@ -22505,18 +22505,18 @@
             this.responseText = transport.responseText == null ?
                 '' : String(transport.responseText);
         }
-        
+
         if(readyState == 4) {
             var xml = transport.responseXML;
             this.responseXML  = xml === undefined ? null : xml;
         }
     },
-    
+
     /**
      * Method: getStatus
      */
     getStatus: OpenLayers.Ajax.Request.prototype.getStatus,
-    
+
     /**
      * Method: getStatustext
      *
@@ -22530,13 +22530,13 @@
             return '';
         }
     },
-    
+
     /**
      * Method: getHeader
      */
     getHeader: OpenLayers.Ajax.Request.prototype.getHeader,
-    
-    /** 
+
+    /**
      * Method: getResponseHeader
      *
      * Returns:
@@ -22550,17 +22550,17 @@
 
 /**
  * Function: getElementsByTagNameNS
- * 
+ *
  * Parameters:
  * parentnode - {?}
  * nsuri - {?}
  * nsprefix - {?}
  * tagname - {?}
- * 
+ *
  * Returns:
  * {?}
  */
-OpenLayers.Ajax.getElementsByTagNameNS  = function(parentnode, nsuri, 
+OpenLayers.Ajax.getElementsByTagNameNS  = function(parentnode, nsuri,
                                                    nsprefix, tagname) {
     var elem = null;
     if (parentnode.getElementsByTagNameNS) {
@@ -22578,9 +22578,9 @@
  *     IE/Safari. We need to come up with a way to serialize in those browser:
  *     for now, these browsers will just fail. #535, #536
  *
- * Parameters: 
+ * Parameters:
  * xmldom {XMLNode} xml dom to serialize
- * 
+ *
  * Returns:
  * {?}
  */
@@ -22611,31 +22611,31 @@
  */
 OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * Property: type
      * {OpenLayers.Control.TYPES}
      */
     type: OpenLayers.Control.TYPE_TOOL,
-    
+
     /**
      * Property: panned
      * {Boolean} The map moved.
      */
     panned: false,
-    
+
     /**
      * Property: interval
      * {Integer} The number of milliseconds that should ellapse before
      *     panning the map again. Set this to increase dragging performance.
      *     Defaults to 25 milliseconds.
      */
-    interval: 25, 
-    
+    interval: 25,
+
     /**
      * Method: draw
      * Creates a Drag handler, using <panMap> and
      * <panMapDone> as callbacks.
-     */    
+     */
     draw: function() {
         this.handler = new OpenLayers.Handler.Drag(this, {
                 "move": this.panMap,
@@ -22660,7 +22660,7 @@
             {dragging: this.handler.dragging, animate: false}
         );
     },
-    
+
     /**
      * Method: panMapDone
      * Finish the panning operation.  Only call setCenter (through <panMap>)
@@ -22704,28 +22704,28 @@
  * Class: OpenLayers.Feature.Vector
  * Vector features use the OpenLayers.Geometry classes as geometry description.
  * They have an 'attributes' property, which is the data object, and a 'style'
- * property, the default values of which are defined in the 
+ * property, the default values of which are defined in the
  * <OpenLayers.Feature.Vector.style> objects.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Feature>
  */
 OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
 
-    /** 
-     * Property: fid 
-     * {String} 
+    /**
+     * Property: fid
+     * {String}
      */
     fid: null,
-    
-    /** 
-     * APIProperty: geometry 
-     * {<OpenLayers.Geometry>} 
+
+    /**
+     * APIProperty: geometry
+     * {<OpenLayers.Geometry>}
      */
     geometry: null,
 
-    /** 
-     * APIProperty: attributes 
+    /**
+     * APIProperty: attributes
      * {Object} This object holds arbitrary properties that describe the
      *     feature.
      */
@@ -22736,37 +22736,37 @@
      * {<OpenLayers.Bounds>} The box bounding that feature's geometry, that
      *     property can be set by an <OpenLayers.Format> object when
      *     deserializing the feature, so in most cases it represents an
-     *     information set by the server. 
+     *     information set by the server.
      */
     bounds: null,
 
-    /** 
-     * Property: state 
-     * {String} 
+    /**
+     * Property: state
+     * {String}
      */
     state: null,
-    
-    /** 
-     * APIProperty: style 
-     * {Object} 
+
+    /**
+     * APIProperty: style
+     * {Object}
      */
     style: null,
-    
+
     /**
      * Property: renderIntent
      * {String} rendering intent currently being used
      */
     renderIntent: "default",
 
-    /** 
+    /**
      * Constructor: OpenLayers.Feature.Vector
-     * Create a vector feature. 
-     * 
+     * Create a vector feature.
+     *
      * Parameters:
      * geometry - {<OpenLayers.Geometry>} The geometry that this feature
      *     represents.
      * attributes - {Object} An optional object that will be mapped to the
-     *     <attributes> property. 
+     *     <attributes> property.
      * style - {Object} An optional style object.
      */
     initialize: function(geometry, attributes, style) {
@@ -22780,10 +22780,10 @@
             this.attributes = OpenLayers.Util.extend(this.attributes,
                                                      attributes);
         }
-        this.style = style ? style : null; 
+        this.style = style ? style : null;
     },
-    
-    /** 
+
+    /**
      * Method: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -22792,11 +22792,11 @@
             this.layer.removeFeatures(this);
             this.layer = null;
         }
-            
+
         this.geometry = null;
         OpenLayers.Feature.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * Method: clone
      * Create a clone of this vector feature.  Does not set any non-standard
@@ -22824,7 +22824,7 @@
      * boundsOnly - {Boolean} Only test whether a feature's bounds intersects
      *     the viewport bounds.  Default is false.  If false, the feature's
      *     geometry must intersect the viewport for onScreen to return true.
-     * 
+     *
      * Returns:
      * {Boolean} The feature is currently visible on screen (optionally
      *     based on its bounds if boundsOnly is true).
@@ -22840,15 +22840,15 @@
                 var screenPoly = screenBounds.toGeometry();
                 onScreen = screenPoly.intersects(this.geometry);
             }
-        }    
+        }
         return onScreen;
     },
-    
+
     /**
      * Method: createMarker
      * HACK - we need to decide if all vector features should be able to
      *     create markers
-     * 
+     *
      * Returns:
      * {<OpenLayers.Marker>} For now just returns null
      */
@@ -22860,7 +22860,7 @@
      * Method: destroyMarker
      * HACK - we need to decide if all vector features should be able to
      *     delete markers
-     * 
+     *
      * If user overrides the createMarker() function, s/he should be able
      *   to also specify an alternative function for destroying it
      */
@@ -22872,7 +22872,7 @@
      * Method: createPopup
      * HACK - we need to decide if all vector features should be able to
      *     create popups
-     * 
+     *
      * Returns:
      * {<OpenLayers.Popup>} For now just returns null
      */
@@ -22883,19 +22883,19 @@
     /**
      * Method: atPoint
      * Determins whether the feature intersects with the specified location.
-     * 
-     * Parameters: 
-     * lonlat - {<OpenLayers.LonLat>} 
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
      * toleranceLon - {float} Optional tolerance in Geometric Coords
      * toleranceLat - {float} Optional tolerance in Geographic Coords
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the feature is at the specified location
      */
     atPoint: function(lonlat, toleranceLon, toleranceLat) {
         var atPoint = false;
         if(this.geometry) {
-            atPoint = this.geometry.atPoint(lonlat, toleranceLon, 
+            atPoint = this.geometry.atPoint(lonlat, toleranceLon,
                                                     toleranceLat);
         }
         return atPoint;
@@ -22931,7 +22931,7 @@
         } else {
             pixel = location;
         }
-        
+
         var lastPixel = this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat());
         var res = this.layer.map.getResolution();
         this.geometry.move(res * (pixel.x - lastPixel.x),
@@ -22939,13 +22939,13 @@
         this.layer.drawFeature(this);
         return lastPixel;
     },
-    
+
     /**
      * Method: toState
      * Sets the new state
      *
      * Parameters:
-     * state - {String} 
+     * state - {String}
      */
     toState: function(state) {
         if (state == OpenLayers.State.UPDATE) {
@@ -22982,24 +22982,24 @@
             this.state = state;
         }
     },
-    
+
     CLASS_NAME: "OpenLayers.Feature.Vector"
 });
 
 
 /**
  * Constant: OpenLayers.Feature.Vector.style
- * OpenLayers features can have a number of style attributes. The 'default' 
+ * OpenLayers features can have a number of style attributes. The 'default'
  *     style will typically be used if no other style is specified. These
  *     styles correspond for the most part, to the styling properties defined
- *     by the SVG standard. 
+ *     by the SVG standard.
  *     Information on fill properties: http://www.w3.org/TR/SVG/painting.html#FillProperties
  *     Information on stroke properties: http://www.w3.org/TR/SVG/painting.html#StrokeProperties
  *
  * Symbolizer properties:
  * fill - {Boolean} Set to false if no fill is desired.
  * fillColor - {String} Hex fill color.  Default is "#ee9900".
- * fillOpacity - {Number} Fill opacity (0-1).  Default is 0.4 
+ * fillOpacity - {Number} Fill opacity (0-1).  Default is 0.4
  * stroke - {Boolean} Set to false if no stroke is desired.
  * strokeColor - {String} Hex stroke color.  Default is "#ee9900".
  * strokeOpacity - {Number} Stroke opacity (0-1).  Default is 1.
@@ -23038,11 +23038,11 @@
  * fontSize - {String} The font size for the label, to be provided like in CSS.
  * fontWeight - {String} The font weight for the label, to be provided like in CSS.
  * display - {String} Symbolizers will have no effect if display is set to "none".  All other values have no effect.
- */ 
+ */
 OpenLayers.Feature.Vector.style = {
     'default': {
         fillColor: "#ee9900",
-        fillOpacity: 0.4, 
+        fillOpacity: 0.4,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "#ee9900",
@@ -23061,7 +23061,7 @@
     },
     'select': {
         fillColor: "blue",
-        fillOpacity: 0.4, 
+        fillOpacity: 0.4,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "blue",
@@ -23080,7 +23080,7 @@
     },
     'temporary': {
         fillColor: "#66cccc",
-        fillOpacity: 0.2, 
+        fillOpacity: 0.2,
         hoverFillColor: "white",
         hoverFillOpacity: 0.8,
         strokeColor: "#66cccc",
@@ -23100,7 +23100,7 @@
     'delete': {
         display: "none"
     }
-};    
+};
 /* ======================================================================
     OpenLayers/Handler/Box.js
    ====================================================================== */
@@ -23116,17 +23116,17 @@
 
 /**
  * Class: OpenLayers.Handler.Box
- * Handler for dragging a rectangle across the map.  Box is displayed 
+ * Handler for dragging a rectangle across the map.  Box is displayed
  * on mouse down, moves on mouse move, and is finished on mouse up.
  *
  * Inherits from:
- *  - <OpenLayers.Handler> 
+ *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Box = OpenLayers.Class(OpenLayers.Handler, {
 
-    /** 
-     * Property: dragHandler 
-     * {<OpenLayers.Handler.Drag>} 
+    /**
+     * Property: dragHandler
+     * {<OpenLayers.Handler.Drag>}
      */
     dragHandler: null,
 
@@ -23136,7 +23136,7 @@
      *     olHandlerBoxZoomBox
      */
     boxDivClassName: 'olHandlerBoxZoomBox',
-    
+
     /**
      * Property: boxCharacteristics
      * {Object} Caches some box characteristics from css. This is used
@@ -23148,18 +23148,18 @@
      * Constructor: OpenLayers.Handler.Box
      *
      * Parameters:
-     * control - {<OpenLayers.Control>} 
+     * control - {<OpenLayers.Control>}
      * callbacks - {Object} An object containing a single function to be
      *                          called when the drag operation is finished.
      *                          The callback should expect to recieve a single
      *                          argument, the point geometry.
-     * options - {Object} 
+     * options - {Object}
      */
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
         var callbacks = {
-            "down": this.startBox, 
-            "move": this.moveBox, 
+            "down": this.startBox,
+            "move": this.moveBox,
             "out":  this.removeBox,
             "up":   this.endBox
         };
@@ -23181,12 +23181,12 @@
     * Method: startBox
     *
     * Parameters:
-    * evt - {Event} 
+    * evt - {Event}
     */
     startBox: function (xy) {
         this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
                                                  this.dragHandler.start);
-        this.zoomBox.className = this.boxDivClassName;                                         
+        this.zoomBox.className = this.boxDivClassName;
         this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
         this.map.viewPortDiv.appendChild(this.zoomBox);
 
@@ -23228,8 +23228,8 @@
     */
     endBox: function(end) {
         var result;
-        if (Math.abs(this.dragHandler.start.x - end.x) > 5 ||    
-            Math.abs(this.dragHandler.start.y - end.y) > 5) {   
+        if (Math.abs(this.dragHandler.start.x - end.x) > 5 ||
+            Math.abs(this.dragHandler.start.y - end.y) > 5) {
             var start = this.dragHandler.start;
             var top = Math.min(start.y, end.y);
             var bottom = Math.max(start.y, end.y);
@@ -23238,7 +23238,7 @@
             result = new OpenLayers.Bounds(left, bottom, right, top);
         } else {
             result = this.dragHandler.start.clone(); // i.e. OL.Pixel
-        } 
+        }
         this.removeBox();
 
         this.callback("done", [result]);
@@ -23281,11 +23281,11 @@
             return false;
         }
     },
-    
+
     /**
      * Method: getCharacteristics
      * Determines offset and box model for a box.
-     * 
+     *
      * Returns:
      * {Object} a hash with the following properties:
      *     - xOffset - Corner offset in x-direction
@@ -23333,12 +23333,12 @@
  *     down, moves or is modified on mouse move, and is finished on mouse up.
  *     The handler triggers callbacks for 'done' and 'cancel'.  Create a new
  *     instance with the <OpenLayers.Handler.RegularPolygon> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.RegularPolygon = OpenLayers.Class(OpenLayers.Handler.Drag, {
-    
+
     /**
      * APIProperty: sides
      * {Integer} Number of sides for the regular polygon.  Needs to be greater
@@ -23355,15 +23355,15 @@
      *     default.
      */
     radius: null,
-    
+
     /**
      * APIProperty: snapAngle
      * {Float} If set to a non-zero value, the handler will snap the polygon
      *     rotation to multiples of the snapAngle.  Value is an angle measured
-     *     in degrees counterclockwise from the positive x-axis.  
+     *     in degrees counterclockwise from the positive x-axis.
      */
     snapAngle: null,
-    
+
     /**
      * APIProperty: snapToggle
      * {String} If set, snapToggle is checked on mouse events and will set
@@ -23374,7 +23374,7 @@
      *     non-zero value.
      */
     snapToggle: 'shiftKey',
-    
+
     /**
      * APIProperty: persist
      * {Boolean} Leave the feature rendered until clear is called.  Default
@@ -23456,18 +23456,18 @@
                                                 [control, callbacks, options]);
         this.options = (options) ? options : new Object();
     },
-    
+
     /**
      * APIMethod: setOptions
-     * 
+     *
      * Parameters:
-     * newOptions - {Object} 
+     * newOptions - {Object}
      */
     setOptions: function (newOptions) {
         OpenLayers.Util.extend(this.options, newOptions);
         OpenLayers.Util.extend(this, newOptions);
     },
-    
+
     /**
      * APIMethod: activate
      * Turn on the handler.
@@ -23525,7 +23525,7 @@
         }
         return deactivated;
     },
-    
+
     /**
      * Method: down
      * Start drawing a new feature
@@ -23552,7 +23552,7 @@
         this.layer.addFeatures([this.feature], {silent: true});
         this.layer.drawFeature(this.feature, this.style);
     },
-    
+
     /**
      * Method: move
      * Respond to drag move events
@@ -23632,7 +23632,7 @@
             this.origin, this.radius, this.sides, this.snapAngle
         );
     },
-    
+
     /**
      * Method: modifyGeometry
      * Modify the polygon geometry in place.
@@ -23653,7 +23653,7 @@
             point.clearBounds();
         }
     },
-    
+
     /**
      * Method: calculateAngle
      * Calculate the angle based on settings.
@@ -23702,7 +23702,7 @@
         this.layer.renderer.clear();
         this.layer.destroyFeatures();
     },
-    
+
     /**
      * Method: callback
      * Trigger the control's named callback with the given arguments
@@ -23746,21 +23746,21 @@
  * Class: OpenLayers.Layer.EventPane
  * Base class for 3rd party layers.  Create a new event pane layer with the
  * <OpenLayers.Layer.EventPane> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.EventPane = OpenLayers.Class(OpenLayers.Layer, {
-    
+
     /**
      * APIProperty: smoothDragPan
      * {Boolean} smoothDragPan determines whether non-public/internal API
-     *     methods are used for better performance while dragging EventPane 
-     *     layers. When not in sphericalMercator mode, the smoother dragging 
-     *     doesn't actually move north/south directly with the number of 
-     *     pixels moved, resulting in a slight offset when you drag your mouse 
-     *     north south with this option on. If this visual disparity bothers 
-     *     you, you should turn this option off, or use spherical mercator. 
+     *     methods are used for better performance while dragging EventPane
+     *     layers. When not in sphericalMercator mode, the smoother dragging
+     *     doesn't actually move north/south directly with the number of
+     *     pixels moved, resulting in a slight offset when you drag your mouse
+     *     north south with this option on. If this visual disparity bothers
+     *     you, you should turn this option off, or use spherical mercator.
      *     Default is on.
      */
     smoothDragPan: true,
@@ -23768,13 +23768,13 @@
     /**
      * Property: isBaseLayer
      * {Boolean} EventPaned layers are always base layers, by necessity.
-     */ 
+     */
     isBaseLayer: true,
 
     /**
      * APIProperty: isFixed
      * {Boolean} EventPaned layers are fixed by default.
-     */ 
+     */
     isFixed: true,
 
     /**
@@ -23787,9 +23787,9 @@
     /**
      * Property: mapObject
      * {Object} This is the object which will be used to load the 3rd party library
-     * in the case of the google layer, this will be of type GMap, 
+     * in the case of the google layer, this will be of type GMap,
      * in the case of the ve layer, this will be of type VEMap
-     */ 
+     */
     mapObject: null,
 
 
@@ -23807,35 +23807,35 @@
             this.pane = OpenLayers.Util.createDiv(this.div.id + "_EventPane");
         }
     },
-    
+
     /**
      * APIMethod: destroy
      * Deconstruct this layer.
      */
     destroy: function() {
         this.mapObject = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
 
-    
+
     /**
      * Method: setMap
      * Set the map property for the layer. This is done through an accessor
-     * so that subclasses can override this and take special action once 
-     * they have their map variable set. 
+     * so that subclasses can override this and take special action once
+     * they have their map variable set.
      *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
     setMap: function(map) {
         OpenLayers.Layer.prototype.setMap.apply(this, arguments);
-        
+
         this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
         this.pane.style.display = this.div.style.display;
         this.pane.style.width="100%";
         this.pane.style.height="100%";
         if (OpenLayers.Util.getBrowserName() == "msie") {
-            this.pane.style.background = 
+            this.pane.style.background =
                 "url(" + OpenLayers.Util.getImagesLocation() + "blank.gif)";
         }
 
@@ -23847,7 +23847,7 @@
 
         // once our layer has been added to the map, we can load it
         this.loadMapObject();
-    
+
         // if map didn't load, display warning
         if (this.mapObject == null) {
             this.loadWarningMessage();
@@ -23857,8 +23857,8 @@
     /**
      * APIMethod: removeMap
      * On being removed from the map, we'll like to remove the invisible 'pane'
-     *     div that we added to it on creation. 
-     * 
+     *     div that we added to it on creation.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -23869,14 +23869,14 @@
         }
         OpenLayers.Layer.prototype.removeMap.apply(this, arguments);
     },
-  
+
     /**
      * Method: loadWarningMessage
-     * If we can't load the map lib, then display an error message to the 
+     * If we can't load the map lib, then display an error message to the
      *     user and tell them where to go for help.
-     * 
+     *
      *     This function sets up the layout for the warning message. Each 3rd
-     *     party layer must implement its own getWarningHTML() function to 
+     *     party layer must implement its own getWarningHTML() function to
      *     provide the actual warning message.
      */
     loadWarningMessage:function() {
@@ -23884,17 +23884,17 @@
         this.div.style.backgroundColor = "darkblue";
 
         var viewSize = this.map.getSize();
-        
+
         var msgW = Math.min(viewSize.w, 300);
         var msgH = Math.min(viewSize.h, 200);
         var size = new OpenLayers.Size(msgW, msgH);
 
         var centerPx = new OpenLayers.Pixel(viewSize.w/2, viewSize.h/2);
 
-        var topLeft = centerPx.add(-size.w/2, -size.h/2);            
+        var topLeft = centerPx.add(-size.w/2, -size.h/2);
 
-        var div = OpenLayers.Util.createDiv(this.name + "_warning", 
-                                            topLeft, 
+        var div = OpenLayers.Util.createDiv(this.name + "_warning",
+                                            topLeft,
                                             size,
                                             null,
                                             null,
@@ -23907,11 +23907,11 @@
         div.innerHTML = this.getWarningHTML();
         this.div.appendChild(div);
     },
-  
-    /** 
+
+    /**
      * Method: getWarningHTML
      * To be implemented by subclasses.
-     * 
+     *
      * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
@@ -23920,7 +23920,7 @@
         //should be implemented by subclasses
         return "";
     },
-  
+
     /**
      * Method: display
      * Set the display on the pane
@@ -23932,11 +23932,11 @@
         OpenLayers.Layer.prototype.display.apply(this, arguments);
         this.pane.style.display = this.div.style.display;
     },
-  
+
     /**
      * Method: setZIndex
      * Set the z-index order for the pane.
-     * 
+     *
      * Parameters:
      * zIndex - {int}
      */
@@ -23948,7 +23948,7 @@
     /**
      * Method: moveTo
      * Handle calls to move the layer.
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * zoomChanged - {Boolean}
@@ -23970,10 +23970,10 @@
                 var moOldZoom = this.getMapObjectZoom();
                 var oldZoom= this.getOLZoomFromMapObjectZoom(moOldZoom);
 
-                if ( !(newCenter.equals(oldCenter)) || 
+                if ( !(newCenter.equals(oldCenter)) ||
                      !(newZoom == oldZoom) ) {
 
-                    if (dragging && this.dragPanMapObject && 
+                    if (dragging && this.dragPanMapObject &&
                         this.smoothDragPan) {
                         var oldPx = this.map.getViewPortPxFromLonLat(oldCenter);
                         var newPx = this.map.getViewPortPxFromLonLat(newCenter);
@@ -23998,7 +23998,7 @@
     /**
      * Method: getLonLatFromViewPortPx
      * Get a map location from a pixel location
-     * 
+     *
      * Parameters:
      * viewPortPx - {<OpenLayers.Pixel>}
      *
@@ -24009,7 +24009,7 @@
      */
     getLonLatFromViewPortPx: function (viewPortPx) {
         var lonlat = null;
-        if ( (this.mapObject != null) && 
+        if ( (this.mapObject != null) &&
              (this.getMapObjectCenter() != null) ) {
             var moPixel = this.getMapObjectPixelFromOLPixel(viewPortPx);
             var moLonLat = this.getMapObjectLonLatFromMapObjectPixel(moPixel);
@@ -24018,7 +24018,7 @@
         return lonlat;
     },
 
- 
+
     /**
      * Method: getViewPortPxFromLonLat
      * Get a pixel location from a map location
@@ -24033,12 +24033,12 @@
      */
     getViewPortPxFromLonLat: function (lonlat) {
         var viewPortPx = null;
-        if ( (this.mapObject != null) && 
+        if ( (this.mapObject != null) &&
              (this.getMapObjectCenter() != null) ) {
 
             var moLonLat = this.getMapObjectLonLatFromOLLonLat(lonlat);
             var moPixel = this.getMapObjectPixelFromMapObjectLonLat(moLonLat);
-        
+
             viewPortPx = this.getOLPixelFromMapObjectPixel(moPixel);
         }
         return viewPortPx;
@@ -24063,9 +24063,9 @@
      *
      * Parameters
      * moLonLat - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.LonLat>} An OpenLayers.LonLat, translated from the passed in 
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat, translated from the passed in
      *          MapObject LonLat
      *          Returns null if null value is passed in
      */
@@ -24085,9 +24085,9 @@
      *
      * Parameters:
      * olLonLat - {<OpenLayers.LonLat>}
-     * 
+     *
      * Returns:
-     * {Object} A MapObject LonLat, translated from the passed in 
+     * {Object} A MapObject LonLat, translated from the passed in
      *          OpenLayers.LonLat
      *          Returns null if null value is passed in
      */
@@ -24111,9 +24111,9 @@
      *
      * Parameters:
      * moPixel - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Pixel>} An OpenLayers.Pixel, translated from the passed in 
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel, translated from the passed in
      *          MapObject Pixel
      *          Returns null if null value is passed in
      */
@@ -24133,9 +24133,9 @@
      *
      * Parameters:
      * olPixel - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
-     * {Object} A MapObject Pixel, translated from the passed in 
+     * {Object} A MapObject Pixel, translated from the passed in
      *          OpenLayers.Pixel
      *          Returns null if null value is passed in
      */
@@ -24163,47 +24163,47 @@
 
 /**
  * Class: OpenLayers.Layer.FixedZoomLevels
- *   Some Layers will already have established zoom levels (like google 
+ *   Some Layers will already have established zoom levels (like google
  *    or ve). Instead of trying to determine them and populate a resolutions[]
  *    Array with those values, we will hijack the resolution functionality
  *    here.
- * 
- *   When you subclass FixedZoomLevels: 
- * 
- *   The initResolutions() call gets nullified, meaning no resolutions[] array 
- *    is set up. Which would be a big problem getResolution() in Layer, since 
+ *
+ *   When you subclass FixedZoomLevels:
+ *
+ *   The initResolutions() call gets nullified, meaning no resolutions[] array
+ *    is set up. Which would be a big problem getResolution() in Layer, since
  *    it merely takes map.zoom and indexes into resolutions[]... but....
- * 
- *   The getResolution() call is also overridden. Instead of using the 
+ *
+ *   The getResolution() call is also overridden. Instead of using the
  *    resolutions[] array, we simply calculate the current resolution based
  *    on the current extent and the current map size. But how will we be able
  *    to calculate the current extent without knowing the resolution...?
- *  
+ *
  *   The getExtent() function is also overridden. Instead of calculating extent
- *    based on the center point and the current resolution, we instead 
- *    calculate the extent by getting the lonlats at the top-left and 
+ *    based on the center point and the current resolution, we instead
+ *    calculate the extent by getting the lonlats at the top-left and
  *    bottom-right by using the getLonLatFromViewPortPx() translation function,
- *    taken from the pixel locations (0,0) and the size of the map. But how 
+ *    taken from the pixel locations (0,0) and the size of the map. But how
  *    will we be able to do lonlat-px translation without resolution....?
- * 
+ *
  *   The getZoomForResolution() method is overridden. Instead of indexing into
  *    the resolutions[] array, we call OpenLayers.Layer.getExent(), passing in
- *    the desired resolution. With this extent, we then call getZoomForExtent() 
- * 
- * 
- *   Whenever you implement a layer using OpenLayers.Layer.FixedZoomLevels, 
+ *    the desired resolution. With this extent, we then call getZoomForExtent()
+ *
+ *
+ *   Whenever you implement a layer using OpenLayers.Layer.FixedZoomLevels,
  *    it is your responsibility to provide the following three functions:
- * 
+ *
  *   - getLonLatFromViewPortPx
  *   - getViewPortPxFromLonLat
  *   - getZoomForExtent
- * 
- *  ...those three functions should generally be provided by any reasonable 
+ *
+ *  ...those three functions should generally be provided by any reasonable
  *  API that you might be working from.
  *
  */
 OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class({
-      
+
   /********************************************************/
   /*                                                      */
   /*                 Baselayer Functions                  */
@@ -24212,19 +24212,19 @@
   /*                  by all base layers                  */
   /*                                                      */
   /********************************************************/
-    
+
     /**
      * Constructor: OpenLayers.Layer.FixedZoomLevels
      * Create a new fixed zoom levels layer.
      */
     initialize: function() {
-        //this class is only just to add the following functions... 
+        //this class is only just to add the following functions...
         // nothing to actually do here... but it is probably a good
-        // idea to have layers that use these functions call this 
-        // inititalize() anyways, in case at some point we decide we 
-        // do want to put some functionality or state in here. 
+        // idea to have layers that use these functions call this
+        // inititalize() anyways, in case at some point we decide we
+        // do want to put some functionality or state in here.
     },
-    
+
     /**
      * Method: initResolutions
      * Populate the resolutions array
@@ -24232,64 +24232,64 @@
     initResolutions: function() {
 
         var props = new Array('minZoomLevel', 'maxZoomLevel', 'numZoomLevels');
-          
+
         for(var i=0, len=props.length; i<len; i++) {
             var property = props[i];
-            this[property] = (this.options[property] != null)  
-                                     ? this.options[property] 
+            this[property] = (this.options[property] != null)
+                                     ? this.options[property]
                                      : this.map[property];
         }
 
         if ( (this.minZoomLevel == null) ||
              (this.minZoomLevel < this.MIN_ZOOM_LEVEL) ){
             this.minZoomLevel = this.MIN_ZOOM_LEVEL;
-        }        
+        }
 
         //
         // At this point, we know what the minimum desired zoom level is, and
-        //  we must calculate the total number of zoom levels. 
-        //  
+        //  we must calculate the total number of zoom levels.
+        //
         //  Because we allow for the setting of either the 'numZoomLevels'
-        //   or the 'maxZoomLevel' properties... on either the layer or the  
+        //   or the 'maxZoomLevel' properties... on either the layer or the
         //   map, we have to define some rules to see which we take into
-        //   account first in this calculation. 
+        //   account first in this calculation.
         //
         // The following is the precedence list for these properties:
-        // 
+        //
         // (1) numZoomLevels set on layer
         // (2) maxZoomLevel set on layer
         // (3) numZoomLevels set on map
         // (4) maxZoomLevel set on map*
         // (5) none of the above*
         //
-        // *Note that options (4) and (5) are only possible if the user 
-        //  _explicitly_ sets the 'numZoomLevels' property on the map to 
-        //  null, since it is set by default to 16. 
+        // *Note that options (4) and (5) are only possible if the user
+        //  _explicitly_ sets the 'numZoomLevels' property on the map to
+        //  null, since it is set by default to 16.
         //
 
         //
-        // Note to future: In 3.0, I think we should remove the default 
-        // value of 16 for map.numZoomLevels. Rather, I think that value 
+        // Note to future: In 3.0, I think we should remove the default
+        // value of 16 for map.numZoomLevels. Rather, I think that value
         // should be set as a default on the Layer.WMS class. If someone
-        // creates a 3rd party layer and does not specify any 'minZoomLevel', 
-        // 'maxZoomLevel', or 'numZoomLevels', and has not explicitly 
+        // creates a 3rd party layer and does not specify any 'minZoomLevel',
+        // 'maxZoomLevel', or 'numZoomLevels', and has not explicitly
         // specified any of those on the map object either.. then I think
         // it is fair to say that s/he wants all the zoom levels available.
-        // 
-        // By making map.numZoomLevels *null* by default, that will be the 
+        //
+        // By making map.numZoomLevels *null* by default, that will be the
         // case. As it is, I don't feel comfortable changing that right now
         // as it would be a glaring API change and actually would probably
-        // break many peoples' codes. 
+        // break many peoples' codes.
         //
 
         //the number of zoom levels we'd like to have.
         var desiredZoomLevels;
 
-        //this is the maximum number of zoom levels the layer will allow, 
+        //this is the maximum number of zoom levels the layer will allow,
         // given the specified starting minimum zoom level.
         var limitZoomLevels = this.MAX_ZOOM_LEVEL - this.minZoomLevel + 1;
 
-        if ( ((this.options.numZoomLevels == null) && 
+        if ( ((this.options.numZoomLevels == null) &&
               (this.options.maxZoomLevel != null)) // (2)
               ||
              ((this.numZoomLevels == null) &&
@@ -24306,18 +24306,18 @@
         if (desiredZoomLevels != null) {
             //Now that we know what we would *like* the number of zoom levels
             // to be, based on layer or map options, we have to make sure that
-            // it does not conflict with the actual limit, as specified by 
+            // it does not conflict with the actual limit, as specified by
             // the constants on the layer itself (and calculated into the
-            // 'limitZoomLevels' variable). 
+            // 'limitZoomLevels' variable).
             this.numZoomLevels = Math.min(desiredZoomLevels, limitZoomLevels);
         } else {
-            // case (5) -- neither 'numZoomLevels' not 'maxZoomLevel' was 
-            // set on either the layer or the map. So we just use the 
+            // case (5) -- neither 'numZoomLevels' not 'maxZoomLevel' was
+            // set on either the layer or the map. So we just use the
             // maximum limit as calculated by the layer's constants.
             this.numZoomLevels = limitZoomLevels;
         }
 
-        //now that the 'numZoomLevels' is appropriately, safely set, 
+        //now that the 'numZoomLevels' is appropriately, safely set,
         // we go back and re-calculate the 'maxZoomLevel'.
         this.maxZoomLevel = this.minZoomLevel + this.numZoomLevels - 1;
 
@@ -24325,17 +24325,17 @@
             var resolutionsIndex = 0;
             this.resolutions = [];
             for(var i= this.minZoomLevel; i <= this.maxZoomLevel; i++) {
-                this.resolutions[resolutionsIndex++] = this.RESOLUTIONS[i];            
+                this.resolutions[resolutionsIndex++] = this.RESOLUTIONS[i];
             }
             this.maxResolution = this.resolutions[0];
             this.minResolution = this.resolutions[this.resolutions.length - 1];
-        }       
+        }
     },
-    
+
     /**
      * APIMethod: getResolution
      * Get the current map resolution
-     * 
+     *
      * Returns:
      * {Float} Map units per Pixel
      */
@@ -24345,10 +24345,10 @@
             return OpenLayers.Layer.prototype.getResolution.apply(this, arguments);
         } else {
             var resolution = null;
-            
+
             var viewSize = this.map.getSize();
             var extent = this.getExtent();
-            
+
             if ((viewSize != null) && (extent != null)) {
                 resolution = Math.max( extent.getWidth()  / viewSize.w,
                                        extent.getHeight() / viewSize.h );
@@ -24359,29 +24359,29 @@
 
     /**
      * APIMethod: getExtent
-     * Calculates using px-> lonlat translation functions on tl and br 
+     * Calculates using px-> lonlat translation functions on tl and br
      *     corners of viewport
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat
      *                       bounds of the current viewPort.
      */
     getExtent: function () {
         var extent = null;
-        
-        
+
+
         var size = this.map.getSize();
-        
+
         var tlPx = new OpenLayers.Pixel(0,0);
         var tlLL = this.getLonLatFromViewPortPx(tlPx);
 
         var brPx = new OpenLayers.Pixel(size.w, size.h);
         var brLL = this.getLonLatFromViewPortPx(brPx);
-        
+
         if ((tlLL != null) && (brLL != null)) {
-            extent = new OpenLayers.Bounds(tlLL.lon, 
-                                       brLL.lat, 
-                                       brLL.lon, 
+            extent = new OpenLayers.Bounds(tlLL.lon,
+                                       brLL.lat,
+                                       brLL.lon,
                                        tlLL.lat);
         }
 
@@ -24400,7 +24400,7 @@
      *           If no baselayer is set, returns null.
      */
     getZoomForResolution: function(resolution) {
-      
+
         if (this.resolutions != null) {
             return OpenLayers.Layer.prototype.getZoomForResolution.apply(this, arguments);
         } else {
@@ -24411,28 +24411,28 @@
 
 
 
-    
+
     /********************************************************/
     /*                                                      */
     /*             Translation Functions                    */
     /*                                                      */
-    /*    The following functions translate GMaps and OL    */ 
+    /*    The following functions translate GMaps and OL    */
     /*     formats for Pixel, LonLat, Bounds, and Zoom      */
     /*                                                      */
     /********************************************************/
-    
-    
+
+
     //
     // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
     //
-  
+
     /**
      * Method: getOLZoomFromMapObjectZoom
      * Get the OL zoom index from the map object zoom level
      *
      * Parameters:
      * moZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} An OpenLayers Zoom level, translated from the passed in zoom
      *           Returns null if null value is passed in
@@ -24444,20 +24444,20 @@
         }
         return zoom;
     },
-    
+
     /**
      * Method: getMapObjectZoomFromOLZoom
      * Get the map object zoom level from the OL zoom level
      *
      * Parameters:
      * olZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} A MapObject level, translated from the passed in olZoom
      *           Returns null if null value is passed in
      */
     getMapObjectZoomFromOLZoom: function(olZoom) {
-        var zoom = null; 
+        var zoom = null;
         if (olZoom != null) {
             zoom = olZoom + this.minZoomLevel;
         }
@@ -24482,47 +24482,47 @@
 
 /**
  * Class: OpenLayers.Layer.HTTPRequest
- * 
- * Inherits from: 
+ *
+ * Inherits from:
  *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
 
-    /** 
+    /**
      * Constant: URL_HASH_FACTOR
      * {Float} Used to hash URL param strings for multi-WMS server selection.
      *         Set to the Golden Ratio per Knuth's recommendation.
      */
     URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
 
-    /** 
+    /**
      * Property: url
-     * {Array(String) or String} This is either an array of url strings or 
-     *                           a single url string. 
+     * {Array(String) or String} This is either an array of url strings or
+     *                           a single url string.
      */
     url: null,
 
-    /** 
+    /**
      * Property: params
      * {Object} Hashtable of key/value parameters
      */
     params: null,
-    
-    /** 
+
+    /**
      * APIProperty: reproject
      * *Deprecated*. See http://trac.openlayers.org/wiki/SpatialMercator
-     * for information on the replacement for this functionality. 
-     * {Boolean} Whether layer should reproject itself based on base layer 
-     *           locations. This allows reprojection onto commercial layers. 
-     *           Default is false: Most layers can't reproject, but layers 
+     * for information on the replacement for this functionality.
+     * {Boolean} Whether layer should reproject itself based on base layer
+     *           locations. This allows reprojection onto commercial layers.
+     *           Default is false: Most layers can't reproject, but layers
      *           which can create non-square geographic pixels can, like WMS.
-     *           
+     *
      */
     reproject: false,
 
     /**
      * Constructor: OpenLayers.Layer.HTTPRequest
-     * 
+     *
      * Parameters:
      * name - {String}
      * url - {Array(String) or String}
@@ -24543,39 +24543,39 @@
     destroy: function() {
         this.url = null;
         this.params = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: clone
-     * 
+     *
      * Parameters:
      * obj - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Layer.HTTPRequest>} An exact clone of this 
+     * {<OpenLayers.Layer.HTTPRequest>} An exact clone of this
      *                                  <OpenLayers.Layer.HTTPRequest>
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.HTTPRequest(this.name,
                                                    this.url,
                                                    this.params,
                                                    this.options);
         }
-        
+
         //get all additions from superclasses
         obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
 
         // copy/set any non-init, non-simple values here
-        
+
         return obj;
     },
 
-    /** 
+    /**
      * APIMethod: setUrl
-     * 
+     *
      * Parameters:
      * newUrl - {String}
      */
@@ -24585,7 +24585,7 @@
 
     /**
      * APIMethod: mergeNewParams
-     * 
+     *
      * Parameters:
      * newParams - {Object}
      *
@@ -24607,18 +24607,18 @@
      * Returns:
      * {Boolean} The layer was redrawn.
      */
-    redraw: function(force) { 
+    redraw: function(force) {
         if (force) {
             return this.mergeNewParams({"_olSalt": Math.random()});
         } else {
             return OpenLayers.Layer.prototype.redraw.apply(this, []);
         }
     },
-    
+
     /**
      * Method: selectUrl
      * selectUrl() implements the standard floating-point multiplicative
-     *     hash function described by Knuth, and hashes the contents of the 
+     *     hash function described by Knuth, and hashes the contents of the
      *     given param string into a float between 0 and 1. This float is then
      *     scaled to the size of the provided urls array, and used to select
      *     a URL.
@@ -24626,60 +24626,60 @@
      * Parameters:
      * paramString - {String}
      * urls - {Array(String)}
-     * 
+     *
      * Returns:
      * {String} An entry from the urls array, deterministically selected based
      *          on the paramString.
      */
     selectUrl: function(paramString, urls) {
         var product = 1;
-        for (var i=0, len=paramString.length; i<len; i++) { 
-            product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR; 
-            product -= Math.floor(product); 
+        for (var i=0, len=paramString.length; i<len; i++) {
+            product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR;
+            product -= Math.floor(product);
         }
         return urls[Math.floor(product * urls.length)];
     },
 
-    /** 
+    /**
      * Method: getFullRequestString
-     * Combine url with layer's params and these newParams. 
-     *   
-     *    does checking on the serverPath variable, allowing for cases when it 
-     *     is supplied with trailing ? or &, as well as cases where not. 
+     * Combine url with layer's params and these newParams.
      *
+     *    does checking on the serverPath variable, allowing for cases when it
+     *     is supplied with trailing ? or &, as well as cases where not.
+     *
      *    return in formatted string like this:
      *        "server?key1=value1&key2=value2&key3=value3"
-     * 
+     *
      * WARNING: The altUrl parameter is deprecated and will be removed in 3.0.
      *
      * Parameters:
      * newParams - {Object}
      * altUrl - {String} Use this as the url instead of the layer's url
-     *   
-     * Returns: 
+     *
+     * Returns:
      * {String}
      */
     getFullRequestString:function(newParams, altUrl) {
 
         // if not altUrl passed in, use layer's url
         var url = altUrl || this.url;
-        
-        // create a new params hashtable with all the layer params and the 
+
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
-        // if url is not a string, it should be an array of strings, 
-        // in which case we will deterministically select one of them in 
+
+        // if url is not a string, it should be an array of strings,
+        // in which case we will deterministically select one of them in
         // order to evenly distribute requests to different urls.
         //
         if (url instanceof Array) {
             url = this.selectUrl(paramsString, url);
-        }   
- 
+        }
+
         // ignore parameters that are already in the url search string
-        var urlParams = 
+        var urlParams =
             OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));
         for(var key in allParams) {
             if(key.toUpperCase() in urlParams) {
@@ -24687,10 +24687,10 @@
             }
         }
         paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         // requestString always starts with url
-        var requestString = url;        
-        
+        var requestString = url;
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -24700,7 +24700,7 @@
                     //serverPath has no ? -- add one
                     requestString += '?' + paramsString;
                 } else {
-                    //serverPath contains ?, so must already have 
+                    //serverPath contains ?, so must already have
                     // paramsString at the end
                     requestString += '&' + paramsString;
                 }
@@ -24726,49 +24726,49 @@
 
 /**
  * Class: OpenLayers.Layer.Markers
- * 
+ *
  * Inherits from:
- *  - <OpenLayers.Layer> 
+ *  - <OpenLayers.Layer>
  */
 OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, {
-    
-    /** 
-     * APIProperty: isBaseLayer 
-     * {Boolean} Markers layer is never a base layer.  
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} Markers layer is never a base layer.
      */
     isBaseLayer: false,
-    
-    /** 
-     * APIProperty: markers 
-     * {Array(<OpenLayers.Marker>)} internal marker list 
+
+    /**
+     * APIProperty: markers
+     * {Array(<OpenLayers.Marker>)} internal marker list
      */
     markers: null,
 
 
-    /** 
-     * Property: drawn 
+    /**
+     * Property: drawn
      * {Boolean} internal state of drawing. This is a workaround for the fact
      * that the map does not call moveTo with a zoomChanged when the map is
      * first starting up. This lets us catch the case where we have *never*
      * drawn the layer, and draw it even if the zoom hasn't changed.
      */
     drawn: false,
-    
+
     /**
-     * Constructor: OpenLayers.Layer.Markers 
+     * Constructor: OpenLayers.Layer.Markers
      * Create a Markers layer.
      *
      * Parameters:
-     * name - {String} 
+     * name - {String}
      * options - {Object} Hashtable of extra options to tag onto the layer
      */
     initialize: function(name, options) {
         OpenLayers.Layer.prototype.initialize.apply(this, arguments);
         this.markers = [];
     },
-    
+
     /**
-     * APIMethod: destroy 
+     * APIMethod: destroy
      */
     destroy: function() {
         this.clearMarkers();
@@ -24779,7 +24779,7 @@
     /**
      * APIMethod: setOpacity
      * Sets the opacity for all the markers.
-     * 
+     *
      * Parameter:
      * opacity - {Float}
      */
@@ -24792,13 +24792,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: moveTo
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * zoomChanged - {Boolean} 
-     * dragging - {Boolean} 
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
      */
     moveTo:function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
@@ -24815,7 +24815,7 @@
      * APIMethod: addMarker
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     addMarker: function(marker) {
         this.markers.push(marker);
@@ -24834,7 +24834,7 @@
      * APIMethod: removeMarker
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     removeMarker: function(marker) {
         if (this.markers && this.markers.length) {
@@ -24856,13 +24856,13 @@
         }
     },
 
-    /** 
+    /**
      * Method: drawMarker
-     * Calculate the pixel location for the marker, create it, and 
+     * Calculate the pixel location for the marker, create it, and
      *    add it to the layer's div
      *
      * Parameters:
-     * marker - {<OpenLayers.Marker>} 
+     * marker - {<OpenLayers.Marker>}
      */
     drawMarker: function(marker) {
         var px = this.map.getLayerPxFromLonLat(marker.lonlat);
@@ -24877,17 +24877,17 @@
             }
         }
     },
-    
-    /** 
+
+    /**
      * APIMethod: getDataExtent
      * Calculates the max extent which includes all of the markers.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
     getDataExtent: function () {
         var maxExtent = null;
-        
+
         if ( this.markers && (this.markers.length > 0)) {
             var maxExtent = new OpenLayers.Bounds();
             for(var i=0, len=this.markers.length; i<len; i++) {
@@ -24929,12 +24929,12 @@
  *
  * WKT:
  *     900913=PROJCS["WGS84 / Simple Mercator", GEOGCS["WGS 84",
- *     DATUM["WGS_1984", SPHEROID["WGS_1984", 6378137.0, 298.257223563]], 
- *     PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295], 
+ *     DATUM["WGS_1984", SPHEROID["WGS_1984", 6378137.0, 298.257223563]],
+ *     PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295],
  *     AXIS["Longitude", EAST], AXIS["Latitude", NORTH]],
- *     PROJECTION["Mercator_1SP_Google"], 
- *     PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], 
- *     PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], 
+ *     PROJECTION["Mercator_1SP_Google"],
+ *     PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0],
+ *     PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0],
  *     PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST],
  *     AXIS["y", NORTH], AUTHORITY["EPSG","900913"]]
  */
@@ -24957,8 +24957,8 @@
         return extent;
     },
 
-    /** 
-     * Method: initMercatorParameters 
+    /**
+     * Method: initMercatorParameters
      * Set up the mercator parameters on the layer: resolutions,
      *     projection, units.
      */
@@ -24978,9 +24978,9 @@
      * Given a lon,lat in EPSG:4326, return a point in Spherical Mercator.
      *
      * Parameters:
-     * lon - {float} 
+     * lon - {float}
      * lat - {float}
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The coordinates transformed to Mercator.
      */
@@ -24989,7 +24989,7 @@
         var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
 
         y = y * 20037508.34 / 180;
-        
+
         return new OpenLayers.LonLat(x, y);
     },
 
@@ -25000,7 +25000,7 @@
      * Parameters:
      * x - {float} A map x in Spherical Mercator.
      * y - {float} A map y in Spherical Mercator.
-     * 
+     *
      * Returns:
      * {<OpenLayers.LonLat>} The coordinates transformed to EPSG:4326.
      */
@@ -25010,19 +25010,19 @@
         var lat = (y / 20037508.34) * 180;
 
         lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
-        
+
         return new OpenLayers.LonLat(lon, lat);
     },
 
     /**
-     * Method: projectForward 
+     * Method: projectForward
      * Given an object with x and y properties in EPSG:4326, modify the x,y
      * properties on the object to be the Spherical Mercator projected
      * coordinates.
      *
      * Parameters:
-     * point - {Object} An object with x and y properties. 
-     * 
+     * point - {Object} An object with x and y properties.
+     *
      * Returns:
      * {Object} The point, with the x and y properties transformed to spherical
      * mercator.
@@ -25033,15 +25033,15 @@
         point.y = lonlat.lat;
         return point;
     },
-    
+
     /**
      * Method: projectInverse
      * Given an object with x and y properties in Spherical Mercator, modify
      * the x,y properties on the object to be the unprojected coordinates.
      *
      * Parameters:
-     * point - {Object} An object with x and y properties. 
-     * 
+     * point - {Object} An object with x and y properties.
+     *
      * Returns:
      * {Object} The point, with the x and y properties transformed from
      * spherical mercator to unprojected coordinates..
@@ -25087,7 +25087,7 @@
  *  - <OpenLayers.Control>
  */
 OpenLayers.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control, {
-    
+
     /**
      * Property: layer
      * {<OpenLayers.Layer.Vector>}
@@ -25099,7 +25099,7 @@
      * {Object} The functions that are sent to the handler for callback
      */
     callbacks: null,
-    
+
     /**
      * Constant: EVENT_TYPES
      *
@@ -25107,7 +25107,7 @@
      * featureadded - Triggered when a feature is added
      */
     EVENT_TYPES: ["featureadded"],
-    
+
     /**
      * APIProperty: featureAdded
      * {Function} Called after each feature is added
@@ -25119,23 +25119,23 @@
      * {Object} Used to set non-default properties on the control's handler
      */
     handlerOptions: null,
-    
+
     /**
      * Constructor: OpenLayers.Control.DrawFeature
-     * 
+     *
      * Parameters:
-     * layer - {<OpenLayers.Layer.Vector>} 
-     * handler - {<OpenLayers.Handler>} 
-     * options - {Object} 
+     * layer - {<OpenLayers.Layer.Vector>}
+     * handler - {<OpenLayers.Handler>}
+     * options - {Object}
      */
     initialize: function(layer, handler, options) {
-        
+
         // concatenate events specific to vector with those from the base
         this.EVENT_TYPES =
             OpenLayers.Control.DrawFeature.prototype.EVENT_TYPES.concat(
             OpenLayers.Control.prototype.EVENT_TYPES
         );
-        
+
         OpenLayers.Control.prototype.initialize.apply(this, [options]);
         this.callbacks = OpenLayers.Util.extend(
             {
@@ -25231,20 +25231,20 @@
      * {Object} Used to set non-default properties on the control's handler
      */
     handlerOptions: null,
-    
+
     /**
      * Property: callbacks
      * {Object} The functions that are sent to the handler for callback
      */
     callbacks: null,
-    
+
     /**
      * Property: displaySystem
      * {String} Display system for output measurements.  Supported values
      *     are 'english', 'metric', and 'geographic'.  Default is 'metric'.
      */
     displaySystem: 'metric',
-    
+
     /**
      * Property: geodesic
      * {Boolean} Calculate geodesic metrics instead of planar metrics.  This
@@ -25252,7 +25252,7 @@
      *     (if that is not already the map projection).  Default is false.
      */
     geodesic: false,
-    
+
     /**
      * Property: displaySystemUnits
      * {Object} Units for various measurement systems.  Values are arrays
@@ -25281,7 +25281,7 @@
      * {Number} Timeout id of trigger for measurepartial.
      */
     delayedTrigger: null,
-    
+
     /**
      * APIProperty: persist
      * {Boolean} Keep the temporary measurement sketch drawn after the
@@ -25293,10 +25293,10 @@
 
     /**
      * Constructor: OpenLayers.Control.Measure
-     * 
+     *
      * Parameters:
-     * handler - {<OpenLayers.Handler>} 
-     * options - {Object} 
+     * handler - {<OpenLayers.Handler>}
+     * options - {Object}
      */
     initialize: function(handler, options) {
         // concatenate events specific to measure with those from the base
@@ -25310,14 +25310,14 @@
             this.callbacks
         );
 
-        // let the handler options override, so old code that passes 'persist' 
+        // let the handler options override, so old code that passes 'persist'
         // directly to the handler does not need an update
         this.handlerOptions = OpenLayers.Util.extend(
             {persist: this.persist}, this.handlerOptions
         );
         this.handler = new handler(this, this.callbacks, this.handlerOptions);
     },
-    
+
     /**
      * APIMethod: cancel
      * Stop the control from measuring.  If <persist> is true, the temporary
@@ -25326,7 +25326,7 @@
     cancel: function() {
         this.handler.cancel();
     },
-    
+
     /**
      * Method: updateHandler
      *
@@ -25358,7 +25358,7 @@
         }
         this.measure(geometry, "measure");
     },
-    
+
     /**
      * Method: measurePartial
      * Called each time a new point is added to the measurement sketch.
@@ -25399,7 +25399,7 @@
             geometry: geometry
         });
     },
-    
+
     /**
      * Method: getBestArea
      * Based on the <displaySystem> returns the area of a geometry.
@@ -25423,7 +25423,7 @@
         }
         return [area, unit];
     },
-    
+
     /**
      * Method: getArea
      *
@@ -25450,7 +25450,7 @@
         }
         return area;
     },
-    
+
     /**
      * Method: getBestLength
      * Based on the <displaySystem> returns the length of a geometry.
@@ -25519,8 +25519,8 @@
 
 /**
  * Class: OpenLayers.Control.ZoomBox
- * The ZoomBox control enables zooming directly to a given extent, by drawing 
- * a box on the map. The box is drawn by holding down shift, whilst dragging 
+ * The ZoomBox control enables zooming directly to a given extent, by drawing
+ * a box on the map. The box is drawn by holding down shift, whilst dragging
  * the mouse.
  *
  * Inherits from:
@@ -25541,13 +25541,13 @@
 
     /**
      * Property: alwaysZoom
-     * {Boolean} Always zoom in/out, when box drawed 
+     * {Boolean} Always zoom in/out, when box drawed
      */
     alwaysZoom: false,
 
     /**
      * Method: draw
-     */    
+     */
     draw: function() {
         this.handler = new OpenLayers.Handler.Box( this,
                             {done: this.zoomBox}, {keyMask: this.keyMask} );
@@ -25582,11 +25582,11 @@
                 var ymax = center.lat + (extent.getHeight()/2)*zoomFactor;
                 var bounds = new OpenLayers.Bounds(xmin, ymin, xmax, ymax);
             }
-            // always zoom in/out 
-            var lastZoom = this.map.getZoom(); 
+            // always zoom in/out
+            var lastZoom = this.map.getZoom();
             this.map.zoomToExtent(bounds);
-            if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){ 
-                this.map.zoomTo(lastZoom + (this.out ? -1 : 1)); 
+            if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){
+                this.map.zoomTo(lastZoom + (this.out ? -1 : 1));
             }
         } else { // it's a pixel
             if (!this.out) {
@@ -25618,12 +25618,12 @@
  * Class: OpenLayers.Format.WKT
  * Class for reading and writing Well-Known Text.  Create a new instance
  * with the <OpenLayers.Format.WKT> constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.WKT = OpenLayers.Class(OpenLayers.Format, {
-    
+
     /**
      * Constructor: OpenLayers.Format.WKT
      * Create a new parser for WKT
@@ -25670,7 +25670,7 @@
                 features = this.parse[type].apply(this, [str]);
             }
             if (this.internalProjection && this.externalProjection) {
-                if (features && 
+                if (features &&
                     features.CLASS_NAME == "OpenLayers.Feature.Vector") {
                     features.geometry.transform(this.externalProjection,
                                                 this.internalProjection);
@@ -25684,7 +25684,7 @@
                     }
                 }
             }
-        }    
+        }
         return features;
     },
 
@@ -25723,9 +25723,9 @@
             }
             if (this.internalProjection && this.externalProjection) {
                 geometry = geometry.clone();
-                geometry.transform(this.internalProjection, 
+                geometry.transform(this.internalProjection,
                                    this.externalProjection);
-            }                       
+            }
             data = this.extract[type].apply(this, [geometry]);
             pieces.push(type.toUpperCase() + '(' + data + ')');
         }
@@ -25734,7 +25734,7 @@
         }
         return pieces.join('');
     },
-    
+
     /**
      * Object with properties corresponding to the geometry types.
      * Property values are functions that do the actual data extraction.
@@ -25762,7 +25762,7 @@
             }
             return array.join(',');
         },
-        
+
         /**
          * Return a comma delimited string of point coordinates from a line.
          * @param {<OpenLayers.Geometry.LineString>} linestring
@@ -25792,7 +25792,7 @@
             }
             return array.join(',');
         },
-        
+
         /**
          * Return a comma delimited string of linear ring arrays from a polygon.
          * @param {<OpenLayers.Geometry.Polygon>} polygon
@@ -25860,7 +25860,7 @@
                 new OpenLayers.Geometry.MultiPoint(components)
             );
         },
-        
+
         /**
          * Return a linestring feature given a linestring WKT fragment.
          * @param {String} A WKT fragment representing the linestring
@@ -25896,7 +25896,7 @@
                 new OpenLayers.Geometry.MultiLineString(components)
             );
         },
-        
+
         /**
          * Return a polygon feature given a polygon WKT fragment.
          * @param {String} A WKT fragment representing the polygon
@@ -25956,8 +25956,8 @@
 
     },
 
-    CLASS_NAME: "OpenLayers.Format.WKT" 
-});     
+    CLASS_NAME: "OpenLayers.Format.WKT"
+});
 /* ======================================================================
     OpenLayers/Layer/Google.js
    ====================================================================== */
@@ -25976,53 +25976,53 @@
 
 /**
  * Class: OpenLayers.Layer.Google
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.SphericalMercator>
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
  */
 OpenLayers.Layer.Google = OpenLayers.Class(
-    OpenLayers.Layer.EventPane, 
+    OpenLayers.Layer.EventPane,
     OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 0 
+     * {Integer} 0
      */
     MIN_ZOOM_LEVEL: 0,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 19
      */
     MAX_ZOOM_LEVEL: 19,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
         0.00274658203125,
-        0.001373291015625, 
-        0.0006866455078125, 
+        0.001373291015625,
+        0.0006866455078125,
         0.00034332275390625,
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
-        0.00002145767211914062, 
+        0.00002145767211914062,
         0.00001072883605957031,
-        0.00000536441802978515, 
+        0.00000536441802978515,
         0.00000268220901489257
     ],
 
@@ -26035,34 +26035,34 @@
     /**
      * APIProperty: sphericalMercator
      * {Boolean} Should the map act as a mercator-projected map? This will
-     *     cause all interactions with the map to be in the actual map 
-     *     projection, which allows support for vector drawing, overlaying 
-     *     other maps, etc. 
+     *     cause all interactions with the map to be in the actual map
+     *     projection, which allows support for vector drawing, overlaying
+     *     other maps, etc.
      */
-    sphericalMercator: false, 
-    
+    sphericalMercator: false,
+
     /**
      * Property: dragObject
      * {GDraggableObject} Since 2.93, Google has exposed the ability to get
      *     the maps GDraggableObject. We can now use this for smooth panning
      */
-    dragObject: null, 
+    dragObject: null,
 
     /**
      * Property: termsOfUse
      * {DOMElement} Div for Google's copyright and terms of use link
      */
-    termsOfUse: null, 
+    termsOfUse: null,
 
     /**
      * Property: poweredBy
      * {DOMElement} Div for Google's powered by logo and link
      */
-    poweredBy: null, 
+    poweredBy: null,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.Google
-     * 
+     *
      * Parameters:
      * name - {String} A name for the layer.
      * options - {Object} An optional object whose properties will be set
@@ -26070,27 +26070,27 @@
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         this.addContainerPxFunction();
         if (this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
-        }    
+        }
     },
-    
-    /** 
+
+    /**
      * Method: loadMapObject
-     * Load the GMap and register appropriate event listeners. If we can't 
+     * Load the GMap and register appropriate event listeners. If we can't
      *     load GMap2, then display a warning message.
      */
     loadMapObject:function() {
-        
+
         //has gmaps library has been loaded?
         try {
             // create GMap, hide nav controls
             this.mapObject = new GMap2( this.div );
-            
+
             //since v 2.93 getDragObject is now available.
             if(typeof this.mapObject.getDragObject == "function") {
                 this.dragObject = this.mapObject.getDragObject();
@@ -26123,21 +26123,21 @@
             this.poweredBy.style.display = this.div.style.display;
             this.poweredBy.style.right = "";
             this.poweredBy.style.bottom = "";
-            this.poweredBy.className = "olLayerGooglePoweredBy gmnoprint"; 
+            this.poweredBy.className = "olLayerGooglePoweredBy gmnoprint";
 
         } catch (e) {
             OpenLayers.Console.error(e);
         }
-               
+
     },
 
-    /** 
+    /**
      * APIMethod: setMap
-     * Overridden from EventPane because if a map type has been specified, 
-     *     we need to attach a listener for the first moveend -- this is how 
-     *     we will know that the map has been centered. Only once the map has 
-     *     been centered is it safe to change the gmap object's map type. 
-     * 
+     * Overridden from EventPane because if a map type has been specified,
+     *     we need to attach a listener for the first moveend -- this is how
+     *     we will know that the map has been centered. Only once the map has
+     *     been centered is it safe to change the gmap object's map type.
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -26148,21 +26148,21 @@
             this.map.events.register("moveend", this, this.setMapType);
         }
     },
-    
-    /** 
+
+    /**
      * Method: setMapType
-     * The map has been centered, and a map type was specified, so we 
+     * The map has been centered, and a map type was specified, so we
      *     set the map type on the gmap object, then unregister the listener
      *     so that we dont keep doing this every time the map moves.
      */
     setMapType: function() {
         if (this.mapObject.getCenter() != null) {
-            
+
             // Support for custom map types.
             if (OpenLayers.Util.indexOf(this.mapObject.getMapTypes(),
                                         this.type) == -1) {
                 this.mapObject.addMapType(this.type);
-            }    
+            }
 
             this.mapObject.setMapType(this.type);
             this.map.events.unregister("moveend", this, this.setMapType);
@@ -26171,7 +26171,7 @@
 
     /**
      * APIMethod: onMapResize
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
@@ -26213,7 +26213,7 @@
     /**
      * APIMethod: removeMap
      * On being removed from the map, also remove termsOfUse and poweredBy divs
-     * 
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -26228,15 +26228,15 @@
         }
         OpenLayers.Layer.EventPane.prototype.removeMap.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: getZoomForExtent
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
-     *  
+     *
      * Returns:
-     * {Integer} Corresponding zoom level for a specified Bounds. 
+     * {Integer} Corresponding zoom level for a specified Bounds.
      *           If mapObject is not loaded or not centered, returns null
      *
     getZoomForExtent: function (bounds) {
@@ -26245,29 +26245,29 @@
             var moBounds = this.getMapObjectBoundsFromOLBounds(bounds);
             var moZoom = this.getMapObjectZoomFromMapObjectBounds(moBounds);
 
-            //make sure zoom is within bounds    
-            var moZoom = Math.min(Math.max(moZoom, this.minZoomLevel), 
+            //make sure zoom is within bounds
+            var moZoom = Math.min(Math.max(moZoom, this.minZoomLevel),
                                  this.maxZoomLevel);
 
             zoom = this.getOLZoomFromMapObjectZoom(moZoom);
         }
         return zoom;
     },
-    
+
     */
-    
+
   //
   // TRANSLATION: MapObject Bounds <-> OpenLayers.Bounds
   //
 
     /**
      * APIMethod: getOLBoundsFromMapObjectBounds
-     * 
+     *
      * Parameters:
      * moBounds - {Object}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Bounds>} An <OpenLayers.Bounds>, translated from the 
+     * {<OpenLayers.Bounds>} An <OpenLayers.Bounds>, translated from the
      *                       passed-in MapObject Bounds.
      *                       Returns null if null value is passed in.
      */
@@ -26280,12 +26280,12 @@
                 sw = this.forwardMercator(sw.lng(), sw.lat());
                 ne = this.forwardMercator(ne.lng(), ne.lat());
             } else {
-                sw = new OpenLayers.LonLat(sw.lng(), sw.lat()); 
-                ne = new OpenLayers.LonLat(ne.lng(), ne.lat()); 
-            }    
-            olBounds = new OpenLayers.Bounds(sw.lon, 
-                                             sw.lat, 
-                                             ne.lon, 
+                sw = new OpenLayers.LonLat(sw.lng(), sw.lat());
+                ne = new OpenLayers.LonLat(ne.lng(), ne.lat());
+            }
+            olBounds = new OpenLayers.Bounds(sw.lon,
+                                             sw.lat,
+                                             ne.lon,
                                              ne.lat );
         }
         return olBounds;
@@ -26293,10 +26293,10 @@
 
     /**
      * APIMethod: getMapObjectBoundsFromOLBounds
-     * 
+     *
      * Parameters:
      * olBounds - {<OpenLayers.Bounds>}
-     * 
+     *
      * Returns:
      * {Object} A MapObject Bounds, translated from olBounds
      *          Returns null if null value is passed in
@@ -26304,11 +26304,11 @@
     getMapObjectBoundsFromOLBounds: function(olBounds) {
         var moBounds = null;
         if (olBounds != null) {
-            var sw = this.sphericalMercator ? 
-              this.inverseMercator(olBounds.bottom, olBounds.left) : 
+            var sw = this.sphericalMercator ?
+              this.inverseMercator(olBounds.bottom, olBounds.left) :
               new OpenLayers.LonLat(olBounds.bottom, olBounds.left);
-            var ne = this.sphericalMercator ? 
-              this.inverseMercator(olBounds.top, olBounds.right) : 
+            var ne = this.sphericalMercator ?
+              this.inverseMercator(olBounds.top, olBounds.right) :
               new OpenLayers.LonLat(olBounds.top, olBounds.right);
             moBounds = new GLatLngBounds(new GLatLng(sw.lat, sw.lon),
                                          new GLatLng(ne.lat, ne.lon));
@@ -26316,41 +26316,41 @@
         return moBounds;
     },
 
-    /** 
+    /**
      * Method: addContainerPxFunction
      * Hack-on function because GMAPS does not give it to us
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * gLatLng - {GLatLng}
-     * 
+     *
      * Returns:
      * {GPoint} A GPoint specifying gLatLng translated into "Container" coords
      */
     addContainerPxFunction: function() {
-        if ( (typeof GMap2 != "undefined") && 
+        if ( (typeof GMap2 != "undefined") &&
              !GMap2.prototype.fromLatLngToContainerPixel) {
-          
+
             GMap2.prototype.fromLatLngToContainerPixel = function(gLatLng) {
-          
+
                 // first we translate into "DivPixel"
                 var gPoint = this.fromLatLngToDivPixel(gLatLng);
-      
+
                 // locate the sliding "Div" div
                 var div = this.getContainer().firstChild.firstChild;
-  
+
                 // adjust by the offset of "Div" and voila!
                 gPoint.x += div.offsetLeft;
                 gPoint.y += div.offsetTop;
-    
+
                 return gPoint;
             };
         }
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -26368,21 +26368,21 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.setCenter(center, zoom); 
+        this.mapObject.setCenter(center, zoom);
     },
-   
+
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -26393,17 +26393,17 @@
 
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
         return this.mapObject.getCenter();
     },
 
-    /** 
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -26413,13 +26413,13 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
@@ -26429,10 +26429,10 @@
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -26440,15 +26440,15 @@
         return this.mapObject.fromLatLngToContainerPixel(moLonLat);
     },
 
-  
+
   // Bounds
-  
-    /** 
+
+    /**
      * APIMethod: getMapObjectZoomFromMapObjectBounds
-     * 
+     *
      * Parameters:
      * moBounds - {Object} MapObject Bounds format
-     * 
+     *
      * Returns:
      * {Object} MapObject Zoom for specified MapObject Bounds
      */
@@ -26464,45 +26464,45 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
           this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lon :
-          moLonLat.lng();  
+          moLonLat.lng();
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        var lat = this.sphericalMercator ? 
+        var lat = this.sphericalMercator ?
           this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lat :
-          moLonLat.lat(); 
-        return lat;  
+          moLonLat.lat();
+        return lat;
     },
-    
+
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -26518,13 +26518,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -26534,10 +26534,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -26547,11 +26547,11 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
@@ -26584,38 +26584,38 @@
  *  - <OpenLayers.Layer.HTTPRequest>
  */
 OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
-    
+
     /**
      * APIProperty: tileSize
      * {<OpenLayers.Size>}
      */
     tileSize: null,
-    
+
     /**
      * Property: grid
-     * {Array(Array(<OpenLayers.Tile>))} This is an array of rows, each row is 
+     * {Array(Array(<OpenLayers.Tile>))} This is an array of rows, each row is
      *     an array of tiles.
      */
     grid: null,
 
     /**
      * APIProperty: singleTile
-     * {Boolean} Moves the layer into single-tile mode, meaning that one tile 
+     * {Boolean} Moves the layer into single-tile mode, meaning that one tile
      *     will be loaded. The tile's size will be determined by the 'ratio'
-     *     property. When the tile is dragged such that it does not cover the 
+     *     property. When the tile is dragged such that it does not cover the
      *     entire viewport, it is reloaded.
      */
     singleTile: false,
 
     /** APIProperty: ratio
-     *  {Float} Used only when in single-tile mode, this specifies the 
+     *  {Float} Used only when in single-tile mode, this specifies the
      *          ratio of the size of the single tile to the size of the map.
      */
     ratio: 1.5,
 
     /**
      * APIProperty: buffer
-     * {Integer} Used only when in gridded mode, this specifies the number of 
+     * {Integer} Used only when in gridded mode, this specifies the number of
      *           extra rows and colums of tiles on each side which will
      *           surround the minimum grid tiles to cover the map.
      */
@@ -26638,10 +26638,10 @@
      * options - {Object} Hashtable of extra options to tag onto the layer
      */
     initialize: function(name, url, params, options) {
-        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, 
+        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,
                                                                 arguments);
-        
-        //grid layers will trigger 'tileloaded' when each new tile is 
+
+        //grid layers will trigger 'tileloaded' when each new tile is
         // loaded, as a means of progress update to listeners.
         // listeners can access 'numLoadingTiles' if they wish to keep track
         // of the loading progress
@@ -26659,7 +26659,7 @@
         this.clearGrid();
         this.grid = null;
         this.tileSize = null;
-        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments); 
+        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);
     },
 
     /**
@@ -26687,12 +26687,12 @@
      *
      * Parameters:
      * obj - {Object} Is this ever used?
-     * 
+     *
      * Returns:
      * {<OpenLayers.Layer.Grid>} An exact clone of this OpenLayers.Layer.Grid
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.Grid(this.name,
                                             this.url,
@@ -26707,12 +26707,12 @@
         if (this.tileSize != null) {
             obj.tileSize = this.tileSize.clone();
         }
-        
+
         // we do not want to copy reference to grid, so we make a new array
         obj.grid = [];
 
         return obj;
-    },    
+    },
 
     /**
      * Method: moveTo
@@ -26727,32 +26727,32 @@
      */
     moveTo:function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);
-        
+
         bounds = bounds || this.map.getExtent();
 
         if (bounds != null) {
-             
+
             // if grid is empty or zoom has changed, we *must* re-tile
             var forceReTile = !this.grid.length || zoomChanged;
 
             // total bounds of the tiles
-            var tilesBounds = this.getTilesBounds();            
-      
+            var tilesBounds = this.getTilesBounds();
+
             if (this.singleTile) {
-                
-                // We want to redraw whenever even the slightest part of the 
+
+                // We want to redraw whenever even the slightest part of the
                 //  current bounds is not contained by our tile.
                 //  (thus, we do not specify partial -- its default is false)
-                if ( forceReTile || 
+                if ( forceReTile ||
                      (!dragging && !tilesBounds.containsBounds(bounds))) {
                     this.initSingleTile(bounds);
                 }
             } else {
-             
-                // if the bounds have changed such that they are not even 
-                //  *partially* contained by our tiles (IE user has 
-                //  programmatically panned to the other side of the earth) 
-                //  then we want to reTile (thus, partial true).  
+
+                // if the bounds have changed such that they are not even
+                //  *partially* contained by our tiles (IE user has
+                //  programmatically panned to the other side of the earth)
+                //  then we want to reTile (thus, partial true).
                 //
                 if (forceReTile || !tilesBounds.containsBounds(bounds, true)) {
                     this.initGriddedTiles(bounds);
@@ -26763,32 +26763,32 @@
             }
         }
     },
-    
+
     /**
      * APIMethod: setTileSize
      * Check if we are in singleTile mode and if so, set the size as a ratio
      *     of the map size (as specified by the layer's 'ratio' property).
-     * 
+     *
      * Parameters:
      * size - {<OpenLayers.Size>}
      */
-    setTileSize: function(size) { 
+    setTileSize: function(size) {
         if (this.singleTile) {
             size = this.map.getSize().clone();
             size.h = parseInt(size.h * this.ratio);
             size.w = parseInt(size.w * this.ratio);
-        } 
+        }
         OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this, [size]);
     },
-        
+
     /**
      * Method: getGridBounds
-     * Deprecated. This function will be removed in 3.0. Please use 
+     * Deprecated. This function will be removed in 3.0. Please use
      *     getTilesBounds() instead.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
-     * currently loaded tiles (including those partially or not at all seen 
+     * currently loaded tiles (including those partially or not at all seen
      * onscreen)
      */
     getGridBounds: function() {
@@ -26804,32 +26804,32 @@
      *
      * Returns:
      * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
-     *     currently loaded tiles (including those partially or not at all seen 
+     *     currently loaded tiles (including those partially or not at all seen
      *     onscreen).
      */
-    getTilesBounds: function() {    
-        var bounds = null; 
-        
+    getTilesBounds: function() {
+        var bounds = null;
+
         if (this.grid.length) {
             var bottom = this.grid.length - 1;
             var bottomLeftTile = this.grid[bottom][0];
-    
-            var right = this.grid[0].length - 1; 
+
+            var right = this.grid[0].length - 1;
             var topRightTile = this.grid[0][right];
-    
-            bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left, 
+
+            bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left,
                                            bottomLeftTile.bounds.bottom,
-                                           topRightTile.bounds.right, 
+                                           topRightTile.bounds.right,
                                            topRightTile.bounds.top);
-            
-        }   
+
+        }
         return bounds;
     },
 
     /**
      * Method: initSingleTile
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     initSingleTile: function(bounds) {
@@ -26838,13 +26838,13 @@
         var center = bounds.getCenterLonLat();
         var tileWidth = bounds.getWidth() * this.ratio;
         var tileHeight = bounds.getHeight() * this.ratio;
-                                       
-        var tileBounds = 
+
+        var tileBounds =
             new OpenLayers.Bounds(center.lon - (tileWidth/2),
                                   center.lat - (tileHeight/2),
                                   center.lon + (tileWidth/2),
                                   center.lat + (tileHeight/2));
-  
+
         var ul = new OpenLayers.LonLat(tileBounds.left, tileBounds.top);
         var px = this.map.getLayerPxFromLonLat(ul);
 
@@ -26855,21 +26855,21 @@
         var tile = this.grid[0][0];
         if (!tile) {
             tile = this.addTile(tileBounds, px);
-            
+
             this.addTileMonitoringHooks(tile);
             tile.draw();
             this.grid[0][0] = tile;
         } else {
             tile.moveTo(tileBounds, px);
-        }           
-        
+        }
+
         //remove all but our single tile
         this.removeExcessTiles(1,1);
     },
 
-    /** 
+    /**
      * Method: calculateGridLayout
-     * Generate parameters for the grid layout. This  
+     * Generate parameters for the grid layout. This
      *
      * Parameters:
      * bounds - {<OpenLayers.Bound>}
@@ -26883,20 +26883,20 @@
     calculateGridLayout: function(bounds, extent, resolution) {
         var tilelon = resolution * this.tileSize.w;
         var tilelat = resolution * this.tileSize.h;
-        
+
         var offsetlon = bounds.left - extent.left;
         var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
         var tilecolremain = offsetlon/tilelon - tilecol;
         var tileoffsetx = -tilecolremain * this.tileSize.w;
         var tileoffsetlon = extent.left + tilecol * tilelon;
-        
-        var offsetlat = bounds.top - (extent.bottom + tilelat);  
+
+        var offsetlat = bounds.top - (extent.bottom + tilelat);
         var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer;
         var tilerowremain = tilerow - offsetlat/tilelat;
         var tileoffsety = -tilerowremain * this.tileSize.h;
         var tileoffsetlat = extent.bottom + tilerow * tilelat;
-        
-        return { 
+
+        return {
           tilelon: tilelon, tilelat: tilelat,
           tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
           tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
@@ -26906,24 +26906,24 @@
 
     /**
      * Method: initGriddedTiles
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
     initGriddedTiles:function(bounds) {
-        
+
         // work out mininum number of rows and columns; this is the number of
         // tiles required to cover the viewport plus at least one for panning
 
         var viewSize = this.map.getSize();
-        var minRows = Math.ceil(viewSize.h/this.tileSize.h) + 
+        var minRows = Math.ceil(viewSize.h/this.tileSize.h) +
                       Math.max(1, 2 * this.buffer);
         var minCols = Math.ceil(viewSize.w/this.tileSize.w) +
                       Math.max(1, 2 * this.buffer);
-        
+
         var extent = this.maxExtent;
         var resolution = this.map.getResolution();
-        
+
         var tileLayout = this.calculateGridLayout(bounds, extent, resolution);
 
         var tileoffsetx = Math.round(tileLayout.tileoffsetx); // heaven help us
@@ -26931,21 +26931,21 @@
 
         var tileoffsetlon = tileLayout.tileoffsetlon;
         var tileoffsetlat = tileLayout.tileoffsetlat;
-        
+
         var tilelon = tileLayout.tilelon;
         var tilelat = tileLayout.tilelat;
 
         this.origin = new OpenLayers.Pixel(tileoffsetx, tileoffsety);
 
-        var startX = tileoffsetx; 
+        var startX = tileoffsetx;
         var startLon = tileoffsetlon;
 
         var rowidx = 0;
-        
+
         var layerContainerDivLeft = parseInt(this.map.layerContainerDiv.style.left);
         var layerContainerDivTop = parseInt(this.map.layerContainerDiv.style.top);
-        
-    
+
+
         do {
             var row = this.grid[rowidx++];
             if (!row) {
@@ -26956,11 +26956,11 @@
             tileoffsetlon = startLon;
             tileoffsetx = startX;
             var colidx = 0;
- 
+
             do {
-                var tileBounds = 
-                    new OpenLayers.Bounds(tileoffsetlon, 
-                                          tileoffsetlat, 
+                var tileBounds =
+                    new OpenLayers.Bounds(tileoffsetlon,
+                                          tileoffsetlat,
                                           tileoffsetlon + tilelon,
                                           tileoffsetlat + tilelat);
 
@@ -26979,44 +26979,44 @@
                 } else {
                     tile.moveTo(tileBounds, px, false);
                 }
-     
-                tileoffsetlon += tilelon;       
+
+                tileoffsetlon += tilelon;
                 tileoffsetx += this.tileSize.w;
             } while ((tileoffsetlon <= bounds.right + tilelon * this.buffer)
                      || colidx < minCols);
-             
+
             tileoffsetlat -= tilelat;
             tileoffsety += this.tileSize.h;
         } while((tileoffsetlat >= bounds.bottom - tilelat * this.buffer)
                 || rowidx < minRows);
-        
+
         //shave off exceess rows and colums
         this.removeExcessTiles(rowidx, colidx);
 
         //now actually draw the tiles
         this.spiralTileLoad();
     },
-    
+
     /**
      * Method: spiralTileLoad
-     *   Starts at the top right corner of the grid and proceeds in a spiral 
-     *    towards the center, adding tiles one at a time to the beginning of a 
-     *    queue. 
-     * 
-     *   Once all the grid's tiles have been added to the queue, we go back 
-     *    and iterate through the queue (thus reversing the spiral order from 
-     *    outside-in to inside-out), calling draw() on each tile. 
+     *   Starts at the top right corner of the grid and proceeds in a spiral
+     *    towards the center, adding tiles one at a time to the beginning of a
+     *    queue.
+     *
+     *   Once all the grid's tiles have been added to the queue, we go back
+     *    and iterate through the queue (thus reversing the spiral order from
+     *    outside-in to inside-out), calling draw() on each tile.
      */
     spiralTileLoad: function() {
         var tileQueue = [];
- 
+
         var directions = ["right", "down", "left", "up"];
 
         var iRow = 0;
         var iCell = -1;
         var direction = OpenLayers.Util.indexOf(directions, "right");
         var directionsTried = 0;
-        
+
         while( directionsTried < directions.length) {
 
             var testRow = iRow;
@@ -27035,21 +27035,21 @@
                 case "up":
                     testRow--;
                     break;
-            } 
-    
-            // if the test grid coordinates are within the bounds of the 
+            }
+
+            // if the test grid coordinates are within the bounds of the
             //  grid, get a reference to the tile.
             var tile = null;
             if ((testRow < this.grid.length) && (testRow >= 0) &&
                 (testCell < this.grid[0].length) && (testCell >= 0)) {
                 tile = this.grid[testRow][testCell];
             }
-            
+
             if ((tile != null) && (!tile.queued)) {
                 //add tile to beginning of queue, mark it as queued.
                 tileQueue.unshift(tile);
                 tile.queued = true;
-                
+
                 //restart the directions counter and take on the new coords
                 directionsTried = 0;
                 iRow = testRow;
@@ -27059,21 +27059,21 @@
                 direction = (direction + 1) % 4;
                 directionsTried++;
             }
-        } 
-        
+        }
+
         // now we go through and draw the tiles in forward order
         for(var i=0, len=tileQueue.length; i<len; i++) {
             var tile = tileQueue[i];
             tile.draw();
             //mark tile as unqueued for the next time (since tiles are reused)
-            tile.queued = false;       
+            tile.queued = false;
         }
     },
 
     /**
      * APIMethod: addTile
-     * Gives subclasses of Grid the opportunity to create an 
-     * OpenLayer.Tile of their choosing. The implementer should initialize 
+     * Gives subclasses of Grid the opportunity to create an
+     * OpenLayer.Tile of their choosing. The implementer should initialize
      * the new tile and take whatever steps necessary to display it.
      *
      * Parameters
@@ -27086,17 +27086,17 @@
     addTile:function(bounds, position) {
         // Should be implemented by subclasses
     },
-    
-    /** 
+
+    /**
      * Method: addTileMonitoringHooks
-     * This function takes a tile as input and adds the appropriate hooks to 
+     * This function takes a tile as input and adds the appropriate hooks to
      *     the tile so that the layer can keep track of the loading tiles.
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * tile - {<OpenLayers.Tile>}
      */
     addTileMonitoringHooks: function(tile) {
-        
+
         tile.onLoadStart = function() {
             //if that was first tile then trigger a 'loadstart' on the layer
             if (this.numLoadingTiles == 0) {
@@ -27105,7 +27105,7 @@
             this.numLoadingTiles++;
         };
         tile.events.register("loadstart", this, tile.onLoadStart);
-      
+
         tile.onLoadEnd = function() {
             this.numLoadingTiles--;
             this.events.triggerEvent("tileloaded");
@@ -27118,12 +27118,12 @@
         tile.events.register("unload", this, tile.onLoadEnd);
     },
 
-    /** 
+    /**
      * Method: removeTileMonitoringHooks
-     * This function takes a tile as input and removes the tile hooks 
+     * This function takes a tile as input and removes the tile hooks
      *     that were added in addTileMonitoringHooks()
-     * 
-     * Parameters: 
+     *
+     * Parameters:
      * tile - {<OpenLayers.Tile>}
      */
     removeTileMonitoringHooks: function(tile) {
@@ -27135,10 +27135,10 @@
             scope: this
         });
     },
-    
+
     /**
      * Method: moveGriddedTiles
-     * 
+     *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      */
@@ -27146,7 +27146,7 @@
         var buffer = this.buffer || 1;
         while (true) {
             var tlLayer = this.grid[0][0].position;
-            var tlViewPort = 
+            var tlViewPort =
                 this.map.getViewPortPxFromLayerPx(tlLayer);
             if (tlViewPort.x > -this.tileSize.w * (buffer - 1)) {
                 this.shiftColumn(true);
@@ -27215,7 +27215,7 @@
             var row = this.grid[i];
             var modelTileIndex = (prepend) ? 0 : (row.length - 1);
             var modelTile = row[modelTileIndex];
-            
+
             var bounds = modelTile.bounds.clone();
             var position = modelTile.position.clone();
             bounds.left = bounds.left + deltaLon;
@@ -27231,18 +27231,18 @@
             }
         }
     },
-    
+
     /**
      * Method: removeExcessTiles
      * When the size of the map or the buffer changes, we may need to
      *     remove some excess rows and columns.
-     * 
+     *
      * Parameters:
      * rows - {Integer} Maximum number of rows we want our grid to have.
      * colums - {Integer} Maximum number of columns we want our grid to have.
      */
     removeExcessTiles: function(rows, columns) {
-        
+
         // remove extra rows
         while (this.grid.length > rows) {
             var row = this.grid.pop();
@@ -27252,7 +27252,7 @@
                 tile.destroy();
             }
         }
-        
+
         // remove extra columns
         while (this.grid[0].length > columns) {
             for (var i=0, l=this.grid.length; i<l; i++) {
@@ -27275,7 +27275,7 @@
             this.setTileSize();
         }
     },
-    
+
     /**
      * APIMethod: getTileBounds
      * Returns The tile bounds for a layer given a pixel location.
@@ -27304,7 +27304,7 @@
                                      tileLeft + tileMapWidth,
                                      tileBottom + tileMapHeight);
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.Grid"
 });
 /* ======================================================================
@@ -27323,7 +27323,7 @@
 
 /**
  * Class: OpenLayers.Layer.VirtualEarth
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
@@ -27331,40 +27331,40 @@
 OpenLayers.Layer.VirtualEarth = OpenLayers.Class(
     OpenLayers.Layer.EventPane,
     OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 1 
+     * {Integer} 1
      */
     MIN_ZOOM_LEVEL: 1,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 17
      */
     MAX_ZOOM_LEVEL: 17,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
         0.00274658203125,
-        0.001373291015625, 
-        0.0006866455078125, 
-        0.00034332275390625, 
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.001373291015625,
+        0.0006866455078125,
+        0.00034332275390625,
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
         0.00002145767211914062
     ],
@@ -27380,9 +27380,9 @@
      * {Boolean} Should the map act as a mercator-projected map? This will
      *     cause all interactions with the map to be in the actual map
      *     projection, which allows support for vector drawing, overlaying
-     *     other maps, etc. 
+     *     other maps, etc.
      */
-    sphericalMercator: false, 
+    sphericalMercator: false,
 
     /**
      * APIProperty: animationEnabled
@@ -27390,25 +27390,25 @@
      *     animated. Set to false to match the zooming experience of other
      *     layer types. Default is true.
      */
-    animationEnabled: true, 
+    animationEnabled: true,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.VirtualEarth
-     * 
+     *
      * Parameters:
      * name - {String}
      * options - {Object}
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         if(this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
         }
     },
-    
+
     /**
      * Method: loadMapObject
      */
@@ -27428,21 +27428,23 @@
         if (this.mapObject != null) {
             try { // this is to catch a Mozilla bug without falling apart
 
-                // The fourth argument is whether the map is 'fixed' -- not 
-                // draggable. See: 
+                // The fourth argument is whether the map is 'fixed' -- not
+                // draggable. See:
                 // http://blogs.msdn.com/virtualearth/archive/2007/09/28/locking-a-virtual-earth-map.aspx
                 //
                 this.mapObject.LoadMap(null, null, this.type, true);
                 this.mapObject.AttachEvent("onmousedown", function() {return true; });
 
             } catch (e) { }
+            this.mapObject.AttachEvent("onresize",
+                OpenLayers.Function.bindAsEventListener(this.redrawDependentLayers, this));
             this.mapObject.HideDashboard();
             if(typeof this.mapObject.SetAnimationEnabled == "function") {
                 this.mapObject.SetAnimationEnabled(this.animationEnabled);
             }
         }
 
-        //can we do smooth panning? this is an unpublished method, so we need 
+        //can we do smooth panning? this is an unpublished method, so we need
         // to be careful
         if ( !this.mapObject ||
              !this.mapObject.vemapcontrol ||
@@ -27453,18 +27455,35 @@
         }
 
     },
-    
+
     /**
+     * Method: redrawDependentLayers
+     */
+    redrawDependentLayers: function(event) {
+        if(this.isBaseLayer)
+        {
+            for(var i=0, len=this.map.layers.length; i<len; i++)
+            {
+                var otherLayer = this.map.layers[i];
+                if(otherLayer != this)
+                {
+                    otherLayer.redraw();
+                }
+            }
+        }
+    },
+
+    /**
      * Method: onMapResize
      */
     onMapResize: function() {
         this.mapObject.Resize(this.map.size.w, this.map.size.h);
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -27485,22 +27504,22 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.SetCenterAndZoom(center, zoom); 
+        this.mapObject.SetCenterAndZoom(center, zoom);
     },
-   
+
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
@@ -27509,7 +27528,7 @@
 
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -27518,9 +27537,9 @@
         this.mapObject.vemapcontrol.PanMap(dX, -dY);
     },
 
-    /** 
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -27530,29 +27549,29 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
     getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
         //the conditional here is to test if we are running the v6 of VE
-        return (typeof VEPixel != 'undefined') 
+        return (typeof VEPixel != 'undefined')
             ? this.mapObject.PixelToLatLong(moPixel)
             : this.mapObject.PixelToLatLong(moPixel.x, moPixel.y);
     },
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -27569,44 +27588,44 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lon :
             moLonLat.Longitude;
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lat :
             moLonLat.Latitude;
     },
 
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -27622,13 +27641,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -27638,10 +27657,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -27651,11 +27670,11 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
@@ -27683,47 +27702,47 @@
 
 /**
  * Class: OpenLayers.Layer.Yahoo
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.EventPane>
  *  - <OpenLayers.Layer.FixedZoomLevels>
  */
 OpenLayers.Layer.Yahoo = OpenLayers.Class(
   OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
-    
-    /** 
+
+    /**
      * Constant: MIN_ZOOM_LEVEL
-     * {Integer} 0 
+     * {Integer} 0
      */
     MIN_ZOOM_LEVEL: 0,
-    
-    /** 
+
+    /**
      * Constant: MAX_ZOOM_LEVEL
      * {Integer} 17
      */
     MAX_ZOOM_LEVEL: 17,
 
-    /** 
+    /**
      * Constant: RESOLUTIONS
      * {Array(Float)} Hardcode these resolutions so that they are more closely
      *                tied with the standard wms projection
      */
     RESOLUTIONS: [
-        1.40625, 
-        0.703125, 
-        0.3515625, 
-        0.17578125, 
-        0.087890625, 
+        1.40625,
+        0.703125,
+        0.3515625,
+        0.17578125,
+        0.087890625,
         0.0439453125,
-        0.02197265625, 
-        0.010986328125, 
-        0.0054931640625, 
-        0.00274658203125, 
-        0.001373291015625, 
-        0.0006866455078125, 
-        0.00034332275390625, 
-        0.000171661376953125, 
-        0.0000858306884765625, 
+        0.02197265625,
+        0.010986328125,
+        0.0054931640625,
+        0.00274658203125,
+        0.001373291015625,
+        0.0006866455078125,
+        0.00034332275390625,
+        0.000171661376953125,
+        0.0000858306884765625,
         0.00004291534423828125,
         0.00002145767211914062,
         0.00001072883605957031
@@ -27734,69 +27753,69 @@
      * {YahooMapType}
      */
     type: null,
-    
+
     /**
      * APIProperty: sphericalMercator
      * {Boolean} Should the map act as a mercator-projected map? This will
      * cause all interactions with the map to be in the actual map projection,
-     * which allows support for vector drawing, overlaying other maps, etc. 
+     * which allows support for vector drawing, overlaying other maps, etc.
      */
-    sphericalMercator: false, 
+    sphericalMercator: false,
 
-    /** 
+    /**
      * Constructor: OpenLayers.Layer.Yahoo
-     * 
+     *
      * Parameters:
      * name - {String}
      * options - {Object}
      */
     initialize: function(name, options) {
         OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
-        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
                                                                     arguments);
         if(this.sphericalMercator) {
             OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
             this.initMercatorParameters();
         }
     },
-    
+
     /**
      * Method: loadMapObject
      */
     loadMapObject:function() {
-        try { //do not crash! 
+        try { //do not crash!
             var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
             this.mapObject = new YMap(this.div, this.type, size);
             this.mapObject.disableKeyControls();
             this.mapObject.disableDragMap();
 
             //can we do smooth panning? (moveByXY is not an API function)
-            if ( !this.mapObject.moveByXY || 
+            if ( !this.mapObject.moveByXY ||
                  (typeof this.mapObject.moveByXY != "function" ) ) {
 
                 this.dragPanMapObject = null;
-            }                
+            }
         } catch(e) {}
     },
 
     /**
      * Method: onMapResize
-     * 
+     *
      */
     onMapResize: function() {
         try {
             var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
             this.mapObject.resizeTo(size);
-        } catch(e) {}     
-    },    
-    
-    
-    /** 
+        } catch(e) {}
+    },
+
+
+    /**
      * APIMethod: setMap
      * Overridden from EventPane because we need to remove this yahoo event
-     *     pane which prohibits our drag and drop, and we can only do this 
+     *     pane which prohibits our drag and drop, and we can only do this
      *     once the map has been loaded and centered.
-     * 
+     *
      * Parameters:
      * map - {<OpenLayers.Map>}
      */
@@ -27806,7 +27825,7 @@
         this.map.events.register("moveend", this, this.fixYahooEventPane);
     },
 
-    /** 
+    /**
      * Method: fixYahooEventPane
      * The map has been centered, so the mysterious yahoo eventpane has been
      *     added. we remove it so that it doesnt mess with *our* event pane.
@@ -27817,15 +27836,15 @@
             if (yahooEventPane.parentNode != null) {
                 yahooEventPane.parentNode.removeChild(yahooEventPane);
             }
-            this.map.events.unregister("moveend", this, 
+            this.map.events.unregister("moveend", this,
                                        this.fixYahooEventPane);
         }
     },
 
-    /** 
+    /**
      * APIMethod: getWarningHTML
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} String with information on why layer is broken, how to get
      *          it working.
      */
@@ -27839,7 +27858,7 @@
   /*                                                      */
   /*             Translation Functions                    */
   /*                                                      */
-  /*    The following functions translate GMaps and OL    */ 
+  /*    The following functions translate GMaps and OL    */
   /*     formats for Pixel, LonLat, Bounds, and Zoom      */
   /*                                                      */
   /********************************************************/
@@ -27848,13 +27867,13 @@
   //
   // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
   //
-  
+
     /**
      * APIMethod: getOLZoomFromMapObjectZoom
-     * 
+     *
      * Parameters:
      * gZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} An OpenLayers Zoom level, translated from the passed in gZoom
      *           Returns null if null value is passed in.
@@ -27867,19 +27886,19 @@
         }
         return zoom;
     },
-    
+
     /**
      * APIMethod: getMapObjectZoomFromOLZoom
-     * 
+     *
      * Parameters:
      * olZoom - {Integer}
-     * 
+     *
      * Returns:
      * {Integer} A MapObject level, translated from the passed in olZoom
      *           Returns null if null value is passed in
      */
     getMapObjectZoomFromOLZoom: function(olZoom) {
-        var zoom = null; 
+        var zoom = null;
         if (olZoom != null) {
             zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this, [olZoom]);
             zoom = 18 - zoom;
@@ -27896,22 +27915,22 @@
 
   // Get&Set Center, Zoom
 
-    /** 
+    /**
      * APIMethod: setMapObjectCenter
      * Set the mapObject to the specified center and zoom
-     * 
+     *
      * Parameters:
      * center - {Object} MapObject LonLat format
      * zoom - {int} MapObject zoom format
      */
     setMapObjectCenter: function(center, zoom) {
-        this.mapObject.drawZoomAndCenter(center, zoom); 
+        this.mapObject.drawZoomAndCenter(center, zoom);
     },
-   
+
     /**
      * APIMethod: getMapObjectCenter
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {Object} The mapObject's current center in Map Object format
      */
     getMapObjectCenter: function() {
@@ -27920,7 +27939,7 @@
 
     /**
      * APIMethod: dragPanMapObject
-     * 
+     *
      * Parameters:
      * dX - {Integer}
      * dY - {Integer}
@@ -27931,10 +27950,10 @@
             'y': dY
         });
     },
-    
-    /** 
+
+    /**
      * APIMethod: getMapObjectZoom
-     * 
+     *
      * Returns:
      * {Integer} The mapObject's current zoom, in Map Object format
      */
@@ -27944,13 +27963,13 @@
 
 
   // LonLat - Pixel Translation
-  
+
     /**
      * APIMethod: getMapObjectLonLatFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat translated from MapObject Pixel
      */
@@ -27960,10 +27979,10 @@
 
     /**
      * APIMethod: getMapObjectPixelFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel transtlated from MapObject LonLat
      */
@@ -27980,44 +27999,44 @@
 
 
   // LonLat
-    
+
     /**
      * APIMethod: getLongitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Longitude of the given MapObject LonLat
      */
     getLongitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lon :
             moLonLat.Lon;
     },
 
     /**
      * APIMethod: getLatitudeFromMapObjectLonLat
-     * 
+     *
      * Parameters:
      * moLonLat - {Object} MapObject LonLat format
-     * 
+     *
      * Returns:
      * {Float} Latitude of the given MapObject LonLat
      */
     getLatitudeFromMapObjectLonLat: function(moLonLat) {
-        return this.sphericalMercator ? 
+        return this.sphericalMercator ?
             this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lat :
             moLonLat.Lat;
     },
 
     /**
      * APIMethod: getMapObjectLonLatFromLonLat
-     * 
+     *
      * Parameters:
      * lon - {Float}
      * lat - {Float}
-     * 
+     *
      * Returns:
      * {Object} MapObject LonLat built from lon and lat params
      */
@@ -28033,13 +28052,13 @@
     },
 
   // Pixel
-    
+
     /**
      * APIMethod: getXFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} X value of the MapObject Pixel
      */
@@ -28049,10 +28068,10 @@
 
     /**
      * APIMethod: getYFromMapObjectPixel
-     * 
+     *
      * Parameters:
      * moPixel - {Object} MapObject Pixel format
-     * 
+     *
      * Returns:
      * {Integer} Y value of the MapObject Pixel
      */
@@ -28062,33 +28081,33 @@
 
     /**
      * APIMethod: getMapObjectPixelFromXY
-     * 
+     *
      * Parameters:
      * x - {Integer}
      * y - {Integer}
-     * 
+     *
      * Returns:
      * {Object} MapObject Pixel from x and y parameters
      */
     getMapObjectPixelFromXY: function(x, y) {
         return new YCoordPoint(x, y);
     },
-    
+
   // Size
-  
+
     /**
      * APIMethod: getMapObjectSizeFromOLSize
-     * 
+     *
      * Parameters:
      * olSize - {<OpenLayers.Size>}
-     * 
+     *
      * Returns:
      * {Object} MapObject Size from olSize parameter
      */
     getMapObjectSizeFromOLSize: function(olSize) {
         return new YSize(olSize.w, olSize.h);
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.Yahoo"
 });
 /* ======================================================================
@@ -28136,7 +28155,7 @@
      *     Example: {'bbox': '5,5,5,5'}
      */
     params: null,
-    
+
     /**
      * Property: callback
      * {Object} Function to be called when the <read>, <create>,
@@ -28169,7 +28188,7 @@
      *
      * Valid options include:
      * url - {String}
-     * headers - {Object} 
+     * headers - {Object}
      * params - {Object}
      * format - {<OpenLayers.Format>}
      * callback - {Function}
@@ -28180,7 +28199,7 @@
         this.headers = {};
         OpenLayers.Protocol.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: destroy
      * Clean up the protocol.
@@ -28190,7 +28209,7 @@
         this.headers = null;
         OpenLayers.Protocol.prototype.destroy.apply(this);
     },
-   
+
     /**
      * Method: createCallback
      * Returns a function that applies the given public method with resp and
@@ -28280,7 +28299,7 @@
     handleRead: function(resp, options) {
         this.handleResponse(resp, options);
     },
-    
+
     /**
      * APIMethod: create
      * Construct a request for writing newly created features.
@@ -28293,7 +28312,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes, its "features" property is then populated with the
      *     the features received from the server.
@@ -28341,7 +28360,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes, its "features" property is then populated with the
      *     the feature received from the server.
@@ -28390,7 +28409,7 @@
      *
      * Returns:
      * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
-     *     object, whose "priv" property references the HTTP request, this 
+     *     object, whose "priv" property references the HTTP request, this
      *     object is also passed to the callback function when the request
      *     completes.
      */
@@ -28501,7 +28520,7 @@
     commit: function(features, options) {
         options = OpenLayers.Util.applyDefaults(options, this.options);
         var resp = [], nResponses = 0;
-        
+
         // Divide up features before issuing any requests.  This properly
         // counts requests in the event that any responses come in before
         // all requests have been issued.
@@ -28515,42 +28534,42 @@
             list = types[feature.state];
             if(list) {
                 list.push(feature);
-                requestFeatures.push(feature); 
+                requestFeatures.push(feature);
             }
         }
         // tally up number of requests
         var nRequests = (types[OpenLayers.State.INSERT].length > 0 ? 1 : 0) +
             types[OpenLayers.State.UPDATE].length +
             types[OpenLayers.State.DELETE].length;
-        
+
         // This response will be sent to the final callback after all the others
         // have been fired.
         var success = true;
         var finalResponse = new OpenLayers.Protocol.Response({
-            reqFeatures: requestFeatures        
+            reqFeatures: requestFeatures
         });
-        
+
         function insertCallback(response) {
             var len = response.features ? response.features.length : 0;
             var fids = new Array(len);
             for(var i=0; i<len; ++i) {
                 fids[i] = response.features[i].fid;
-            }   
+            }
             finalResponse.insertIds = fids;
             callback.apply(this, [response]);
         }
- 
+
         function callback(response) {
             this.callUserCallback(response, options);
             success = success && response.success();
             nResponses++;
             if (nResponses >= nRequests) {
                 if (options.callback) {
-                    finalResponse.code = success ? 
+                    finalResponse.code = success ?
                         OpenLayers.Protocol.Response.SUCCESS :
                         OpenLayers.Protocol.Response.FAILURE;
                     options.callback.apply(options.scope, [finalResponse]);
-                }    
+                }
             }
         }
 
@@ -28614,7 +28633,7 @@
         }
     },
 
-    CLASS_NAME: "OpenLayers.Protocol.HTTP" 
+    CLASS_NAME: "OpenLayers.Protocol.HTTP"
 });
 /* ======================================================================
     OpenLayers/Style.js
@@ -28642,13 +28661,13 @@
      * {String}
      */
     name: null,
-    
+
     /**
      * Property: title
      * {String} Title of this style (set if included in SLD)
      */
     title: null,
-    
+
     /**
      * Property: description
      * {String} Description of this style (set if abstract is included in SLD)
@@ -28661,19 +28680,19 @@
      * according to the NamedLayer attribute of an SLD document.
      */
     layerName: null,
-    
+
     /**
      * APIProperty: isDefault
      * {Boolean}
      */
     isDefault: false,
-     
-    /** 
-     * Property: rules 
+
+    /**
+     * Property: rules
      * {Array(<OpenLayers.Rule>)}
      */
     rules: null,
-    
+
     /**
      * Property: context
      * {Object} An optional object with properties that symbolizers' property
@@ -28691,7 +28710,7 @@
      * rules defined.
      */
     defaultStyle: null,
-    
+
     /**
      * Property: defaultsPerSymbolizer
      * {Boolean} If set to true, the <defaultStyle> will extend the symbolizer
@@ -28700,16 +28719,16 @@
      * graphic set to true. Default is false.
      */
     defaultsPerSymbolizer: false,
-    
+
     /**
      * Property: propertyStyles
      * {Hash of Boolean} cache of style properties that need to be parsed for
      * propertyNames. Property names are keys, values won't be used.
      */
     propertyStyles: null,
-    
 
-    /** 
+
+    /**
      * Constructor: OpenLayers.Style
      * Creates a UserStyle.
      *
@@ -28724,7 +28743,7 @@
      * Valid options:
      * rules - {Array(<OpenLayers.Rule>)} List of rules to be added to the
      *     style.
-     * 
+     *
      * Return:
      * {<OpenLayers.Style>}
      */
@@ -28743,7 +28762,7 @@
 
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -28755,22 +28774,22 @@
         this.rules = null;
         this.defaultStyle = null;
     },
-    
+
     /**
      * Method: createSymbolizer
      * creates a style by applying all feature-dependent rules to the base
      * style.
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} feature to evaluate rules for
-     * 
+     *
      * Returns:
      * {Object} symbolizer hash
      */
     createSymbolizer: function(feature) {
         var style = this.defaultsPerSymbolizer ? {} : this.createLiterals(
             OpenLayers.Util.extend({}, this.defaultStyle), feature);
-        
+
         var rules = this.rules;
 
         var rule, context;
@@ -28780,7 +28799,7 @@
             rule = rules[i];
             // does the rule apply?
             var applies = rule.evaluate(feature);
-            
+
             if(applies) {
                 if(rule instanceof OpenLayers.Rule && rule.elseFilter) {
                     elseRules.push(rule);
@@ -28790,7 +28809,7 @@
                 }
             }
         }
-        
+
         // if no other rules apply, apply the rules with else filters
         if(appliedRules == false && elseRules.length > 0) {
             appliedRules = true;
@@ -28803,10 +28822,10 @@
         if(rules.length > 0 && appliedRules == false) {
             style.display = "none";
         }
-        
+
         return style;
     },
-    
+
     /**
      * Method: applySymbolizer
      *
@@ -28824,7 +28843,7 @@
                 OpenLayers.Style.SYMBOLIZER_PREFIXES[0];
 
         var symbolizer = rule.symbolizer[symbolizerPrefix] || rule.symbolizer;
-        
+
         if(this.defaultsPerSymbolizer === true) {
             var defaults = this.defaultStyle;
             OpenLayers.Util.applyDefaults(symbolizer, {
@@ -28863,35 +28882,35 @@
         return this.createLiterals(
                 OpenLayers.Util.extend(style, symbolizer), feature);
     },
-    
+
     /**
      * Method: createLiterals
      * creates literals for all style properties that have an entry in
      * <this.propertyStyles>.
-     * 
+     *
      * Parameters:
      * style   - {Object} style to create literals for. Will be modified
      *           inline.
      * feature - {Object}
-     * 
+     *
      * Returns:
      * {Object} the modified style
      */
     createLiterals: function(style, feature) {
         var context = this.context || feature.attributes || feature.data;
-        
+
         for (var i in this.propertyStyles) {
             style[i] = OpenLayers.Style.createLiteral(style[i], context, feature);
         }
         return style;
     },
-    
+
     /**
      * Method: findPropertyStyles
      * Looks into all rules for this style and the defaultStyle to collect
      * all the style hash property names containing ${...} strings that have
      * to be replaced using the createLiteral method before returning them.
-     * 
+     *
      * Returns:
      * {Object} hash of property names that need createLiteral parsing. The
      * name of the property is the key, and the value is true;
@@ -28922,15 +28941,15 @@
         }
         return propertyStyles;
     },
-    
+
     /**
      * Method: addPropertyStyles
-     * 
+     *
      * Parameters:
      * propertyStyles - {Object} hash to add new property styles to. Will be
      *                  modified inline
      * symbolizer     - {Object} search this symbolizer for property styles
-     * 
+     *
      * Returns:
      * {Object} propertyStyles hash
      */
@@ -28945,11 +28964,11 @@
         }
         return propertyStyles;
     },
-    
+
     /**
      * APIMethod: addRules
      * Adds rules to this style.
-     * 
+     *
      * Parameters:
      * rules - {Array(<OpenLayers.Rule>)}
      */
@@ -28957,27 +28976,27 @@
         this.rules = this.rules.concat(rules);
         this.propertyStyles = this.findPropertyStyles();
     },
-    
+
     /**
      * APIMethod: setDefaultStyle
      * Sets the default style for this style object.
-     * 
+     *
      * Parameters:
      * style - {Object} Hash of style properties
      */
     setDefaultStyle: function(style) {
-        this.defaultStyle = style; 
+        this.defaultStyle = style;
         this.propertyStyles = this.findPropertyStyles();
     },
-        
+
     /**
      * Method: getSymbolizerPrefix
      * Returns the correct symbolizer prefix according to the
      * geometry type of the passed geometry
-     * 
+     *
      * Parameters:
      * geometry {<OpenLayers.Geometry>}
-     * 
+     *
      * Returns:
      * {String} key of the according symbolizer
      */
@@ -28989,7 +29008,7 @@
             }
         }
     },
-    
+
     CLASS_NAME: "OpenLayers.Style"
 });
 
@@ -28998,7 +29017,7 @@
  * Function: createLiteral
  * converts a style value holding a combination of PropertyName and Literal
  * into a Literal, taking the property values from the passed features.
- * 
+ *
  * Parameters:
  * value - {String} value to parse. If this string contains a construct like
  *         "foo ${bar}", then "foo " will be taken as literal, and "${bar}"
@@ -29007,7 +29026,7 @@
  * context - {Object} context to take attribute values from
  * feature - {OpenLayers.Feature.Vector} The feature that will be passed
  *     to <OpenLayers.String.format> for evaluating functions in the context.
- * 
+ *
  * Returns:
  * {String} the parsed value. In the example of the value parameter above, the
  * result would be "foo valueOfBar", assuming that the passed feature has an
@@ -29020,7 +29039,7 @@
     }
     return value;
 };
-    
+
 /**
  * Constant: OpenLayers.Style.SYMBOLIZER_PREFIXES
  * {Array} prefixes of the sld symbolizers. These are the
@@ -29045,21 +29064,21 @@
 /**
  * Class: OpenLayers.Control.Navigation
  * The navigation control handles map browsing with mouse events (dragging,
- *     double-clicking, and scrolling the wheel).  Create a new navigation 
- *     control with the <OpenLayers.Control.Navigation> control.  
- * 
- *     Note that this control is added to the map by default (if no controls 
- *     array is sent in the options object to the <OpenLayers.Map> 
+ *     double-clicking, and scrolling the wheel).  Create a new navigation
+ *     control with the <OpenLayers.Control.Navigation> control.
+ *
+ *     Note that this control is added to the map by default (if no controls
+ *     array is sent in the options object to the <OpenLayers.Map>
  *     constructor).
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Control>
  */
 OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
 
-    /** 
+    /**
      * Property: dragPan
-     * {<OpenLayers.Control.DragPan>} 
+     * {<OpenLayers.Control.DragPan>}
      */
     dragPan: null,
 
@@ -29069,7 +29088,7 @@
      */
     dragPanOptions: null,
 
-    /** 
+    /**
      * Property: zoomBox
      * {<OpenLayers.Control.ZoomBox>}
      */
@@ -29079,7 +29098,7 @@
      * APIProperty: zoomWheelEnabled
      * {Boolean} Whether the mousewheel should zoom the map
      */
-    zoomWheelEnabled: true, 
+    zoomWheelEnabled: true,
 
     /**
      * APIProperty: handleRightClicks
@@ -29090,18 +29109,18 @@
     /**
      * APIProperty: zoomBoxKeyMask
      * {Integer} <OpenLayers.Handler> key code of the key, which has to be
-     *    pressed, while drawing the zoom box with the mouse on the screen. 
+     *    pressed, while drawing the zoom box with the mouse on the screen.
      *    You should probably set handleRightClicks to true if you use this
      *    with MOD_CTRL, to disable the context menu for machines which use
      *    CTRL-Click as a right click.
      * Default: <OpenLayers.Handler.MOD_SHIFT
      */
     zoomBoxKeyMask: OpenLayers.Handler.MOD_SHIFT,
-    
+
     /**
      * Constructor: OpenLayers.Control.Navigation
      * Create a new navigation control
-     * 
+     *
      * Parameters:
      * options - {Object} An optional object whose properties will be set on
      *                    the control
@@ -29131,7 +29150,7 @@
         this.zoomBox = null;
         OpenLayers.Control.prototype.destroy.apply(this,arguments);
     },
-    
+
     /**
      * Method: activate
      */
@@ -29139,7 +29158,7 @@
         this.dragPan.activate();
         if (this.zoomWheelEnabled) {
             this.handlers.wheel.activate();
-        }    
+        }
         this.handlers.click.activate();
         this.zoomBox.activate();
         return OpenLayers.Control.prototype.activate.apply(this,arguments);
@@ -29155,7 +29174,7 @@
         this.handlers.wheel.deactivate();
         return OpenLayers.Control.prototype.deactivate.apply(this,arguments);
     },
-    
+
     /**
      * Method: draw
      */
@@ -29165,12 +29184,12 @@
             this.map.viewPortDiv.oncontextmenu = function () { return false;};
         }
 
-        var clickCallbacks = { 
-            'dblclick': this.defaultDblClick, 
-            'dblrightclick': this.defaultDblRightClick 
+        var clickCallbacks = {
+            'dblclick': this.defaultDblClick,
+            'dblrightclick': this.defaultDblRightClick
         };
         var clickOptions = {
-            'double': true, 
+            'double': true,
             'stopDouble': true
         };
         this.handlers.click = new OpenLayers.Handler.Click(
@@ -29190,29 +29209,29 @@
     },
 
     /**
-     * Method: defaultDblClick 
-     * 
+     * Method: defaultDblClick
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     defaultDblClick: function (evt) {
-        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
         this.map.setCenter(newCenter, this.map.zoom + 1);
     },
 
     /**
-     * Method: defaultDblRightClick 
-     * 
+     * Method: defaultDblRightClick
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     defaultDblRightClick: function (evt) {
-        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
         this.map.setCenter(newCenter, this.map.zoom - 1);
     },
-    
+
     /**
-     * Method: wheelChange  
+     * Method: wheelChange
      *
      * Parameters:
      * evt - {Event}
@@ -29234,10 +29253,10 @@
         this.map.setCenter( newCenter, newZoom );
     },
 
-    /** 
+    /**
      * Method: wheelUp
      * User spun scroll wheel up
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
@@ -29245,35 +29264,35 @@
         this.wheelChange(evt, 1);
     },
 
-    /** 
+    /**
      * Method: wheelDown
      * User spun scroll wheel down
-     * 
+     *
      * Parameters:
      * evt - {Event}
      */
     wheelDown: function(evt) {
         this.wheelChange(evt, -1);
     },
-    
+
     /**
      * Method: disableZoomWheel
      */
-    
+
     disableZoomWheel : function() {
         this.zoomWheelEnabled = false;
-        this.handlers.wheel.deactivate();       
+        this.handlers.wheel.deactivate();
     },
-    
+
     /**
      * Method: enableZoomWheel
      */
-    
+
     enableZoomWheel : function() {
         this.zoomWheelEnabled = true;
         if (this.active) {
             this.handlers.wheel.activate();
-        }    
+        }
     },
 
     CLASS_NAME: "OpenLayers.Control.Navigation"
@@ -29285,7 +29304,7 @@
 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
  * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
- 
+
 /**
  * @requires OpenLayers/Format/WKT.js
  * @requires OpenLayers/Feature/Vector.js
@@ -29313,19 +29332,19 @@
     parent: null,
 
     /**
-     * Property: bounds 
+     * Property: bounds
      * {<OpenLayers.Bounds>} The bounds of this geometry
      */
     bounds: null,
 
     /**
      * Constructor: OpenLayers.Geometry
-     * Creates a geometry object.  
+     * Creates a geometry object.
      */
     initialize: function() {
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME+ "_");
     },
-    
+
     /**
      * Method: destroy
      * Destroy this geometry.
@@ -29334,31 +29353,31 @@
         this.id = null;
         this.bounds = null;
     },
-    
+
     /**
      * APIMethod: clone
      * Create a clone of this geometry.  Does not set any non-standard
      *     properties of the cloned geometry.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Geometry>} An exact clone of this geometry.
      */
     clone: function() {
         return new OpenLayers.Geometry();
     },
-    
+
     /**
      * Set the bounds for this Geometry.
-     * 
+     *
      * Parameters:
-     * object - {<OpenLayers.Bounds>} 
+     * object - {<OpenLayers.Bounds>}
      */
     setBounds: function(bounds) {
         if (bounds) {
             this.bounds = bounds.clone();
         }
     },
-    
+
     /**
      * Method: clearBounds
      * Nullify this components bounds and that of its parent as well.
@@ -29367,16 +29386,16 @@
         this.bounds = null;
         if (this.parent) {
             this.parent.clearBounds();
-        }    
+        }
     },
-    
+
     /**
      * Method: extendBounds
-     * Extend the existing bounds to include the new bounds. 
+     * Extend the existing bounds to include the new bounds.
      * If geometry's bounds is not yet set, then set a new Bounds.
-     * 
+     *
      * Parameters:
-     * newBounds - {<OpenLayers.Bounds>} 
+     * newBounds - {<OpenLayers.Bounds>}
      */
     extendBounds: function(newBounds){
         var bounds = this.getBounds();
@@ -29386,12 +29405,12 @@
             this.bounds.extend(newBounds);
         }
     },
-    
+
     /**
      * APIMethod: getBounds
-     * Get the bounds for this Geometry. If bounds is not set, it 
+     * Get the bounds for this Geometry. If bounds is not set, it
      * is calculated again, this makes queries faster.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -29401,17 +29420,17 @@
         }
         return this.bounds;
     },
-    
-    /** 
+
+    /**
      * APIMethod: calculateBounds
-     * Recalculate the bounds for the geometry. 
+     * Recalculate the bounds for the geometry.
      */
     calculateBounds: function() {
         //
         // This should be overridden by subclasses.
         //
     },
-    
+
     /**
      * APIMethod: distanceTo
      * Calculate the closest distance between two geometries (on the x-y plane).
@@ -29422,7 +29441,7 @@
      *     calculation.
      *
      * Valid options depend on the specific geometry type.
-     * 
+     *
      * Returns:
      * {Number | Object} The distance between this geometry and the target.
      *     If details is true, the return will be an object with distance,
@@ -29433,7 +29452,7 @@
      */
     distanceTo: function(geometry, options) {
     },
-    
+
     /**
      * APIMethod: getVertices
      * Return a list of all points in this geometry.
@@ -29452,14 +29471,14 @@
 
     /**
      * Method: atPoint
-     * Note - This is only an approximation based on the bounds of the 
+     * Note - This is only an approximation based on the bounds of the
      * geometry.
-     * 
+     *
      * Parameters:
-     * lonlat - {<OpenLayers.LonLat>} 
+     * lonlat - {<OpenLayers.LonLat>}
      * toleranceLon - {float} Optional tolerance in Geometric Coords
      * toleranceLat - {float} Optional tolerance in Geographic Coords
-     * 
+     *
      * Returns:
      * {Boolean} Whether or not the geometry is at the specified location
      */
@@ -29470,8 +29489,8 @@
 
             var dX = (toleranceLon != null) ? toleranceLon : 0;
             var dY = (toleranceLat != null) ? toleranceLat : 0;
-    
-            var toleranceBounds = 
+
+            var toleranceBounds =
                 new OpenLayers.Bounds(this.bounds.left - dX,
                                       this.bounds.bottom - dY,
                                       this.bounds.right + dX,
@@ -29481,12 +29500,12 @@
         }
         return atPoint;
     },
-    
+
     /**
      * Method: getLength
      * Calculate the length of this geometry. This method is defined in
      * subclasses.
-     * 
+     *
      * Returns:
      * {Float} The length of the collection by summing its parts
      */
@@ -29499,7 +29518,7 @@
     /**
      * Method: getArea
      * Calculate the area of this geometry. This method is defined in subclasses.
-     * 
+     *
      * Returns:
      * {Float} The area of the collection by summing its parts
      */
@@ -29508,7 +29527,7 @@
         //
         return 0.0;
     },
-    
+
     /**
      * APIMethod: getCentroid
      * Calculate the centroid of this geometry. This method is defined in subclasses.
@@ -29566,7 +29585,7 @@
     }
     return geom;
 };
-    
+
 /**
  * Method: OpenLayers.Geometry.segmentsIntersect
  * Determine whether two line segments intersect.  Optionally calculates
@@ -29665,7 +29684,7 @@
                         }
                     }
                 }
-                
+
             }
         } else {
             // no calculated intersection, but segments could be within
@@ -29760,52 +29779,52 @@
  */
 OpenLayers.Layer.MapGuide = OpenLayers.Class(OpenLayers.Layer.Grid, {
 
-    /** 
+    /**
      * APIProperty: isBaseLayer
      * {Boolean} Treat this layer as a base layer.  Default is true.
      **/
     isBaseLayer: true,
-    
+
     /**
      * APIProperty: useHttpTile
-     * {Boolean} use a tile cache exposed directly via a webserver rather than the 
-	   *    via mapguide server. This does require extra configuration on the Mapguide Server,
-	   *    and will only work when singleTile is false. The url for the layer must be set to the
-	   *    webserver path rather than the Mapguide mapagent.	  
-	   *    See http://trac.osgeo.org/mapguide/wiki/CodeSamples/Tiles/ServingTilesViaHttp 
+     * {Boolean} use a tile cache exposed directly via a webserver rather than the
+       *    via mapguide server. This does require extra configuration on the Mapguide Server,
+       *    and will only work when singleTile is false. The url for the layer must be set to the
+       *    webserver path rather than the Mapguide mapagent.
+       *    See http://trac.osgeo.org/mapguide/wiki/CodeSamples/Tiles/ServingTilesViaHttp
      **/
     useHttpTile: false,
-    
-    /** 
+
+    /**
      * APIProperty: singleTile
-     * {Boolean} use tile server or request single tile image. 
+     * {Boolean} use tile server or request single tile image.
      **/
     singleTile: false,
-    
-    /** 
+
+    /**
      * APIProperty: useOverlay
      * {Boolean} flag to indicate if the layer should be retrieved using
      * GETMAPIMAGE (default) or using GETDYNAMICOVERLAY requests.
      **/
     useOverlay: false,
-    
-    /** 
+
+    /**
      * APIProperty: useAsyncOverlay
-     * {Boolean} indicates if the MapGuide site supports the asynchronous 
+     * {Boolean} indicates if the MapGuide site supports the asynchronous
      * GETDYNAMICOVERLAY requests which is available in MapGuide Enterprise 2010
-     * and MapGuide Open Source v2.0.3 or higher. The newer versions of MG 
-     * is called asynchronously, allows selections to be drawn separately from 
+     * and MapGuide Open Source v2.0.3 or higher. The newer versions of MG
+     * is called asynchronously, allows selections to be drawn separately from
      * the map and offers styling options.
-     * 
+     *
      * With older versions of MapGuide, set useAsyncOverlay=false.  Note that in
      * this case a synchronous AJAX call is issued and the mapname and session
      * parameters must be used to initialize the layer, not the mapdefinition
-     * parameter. Also note that this will issue a synchronous AJAX request 
+     * parameter. Also note that this will issue a synchronous AJAX request
      * before the image request can be issued so the users browser may lock
      * up if the MG Web tier does not respond in a timely fashion.
      **/
     useAsyncOverlay: true,
-    
+
     /**
      * Constant: TILE_PARAMS
      * {Object} Hashtable of default parameter key/value pairs for tiled layer
@@ -29826,7 +29845,7 @@
         clip: '1',
         version: '1.0.0'
     },
-    
+
     /**
      * Constant: OVERLAY_PARAMS
      * {Object} Hashtable of default parameter key/value pairs for untiled layer
@@ -29838,11 +29857,11 @@
         clip: '1',
         version: '2.0.0'
     },
-    
-    /** 
+
+    /**
      * Constant: FOLDER_PARAMS
-     * {Object} Hashtable of parameter key/value pairs which describe 
-     * the folder structure for tiles as configured in the mapguide 
+     * {Object} Hashtable of parameter key/value pairs which describe
+     * the folder structure for tiles as configured in the mapguide
      * serverconfig.ini section [TileServiceProperties]
      */
     FOLDER_PARAMS: {
@@ -29850,9 +29869,9 @@
         tileRowsPerFolder: 30,
         format: 'png',
         querystring: null
-    },	
+    },
 
-    /** 
+    /**
      * Property: defaultSize
      * {<OpenLayers.Size>} Tile size as produced by MapGuide server
      **/
@@ -29860,21 +29879,21 @@
 
     /**
      * Constructor: OpenLayers.Layer.MapGuide
-     * Create a new Mapguide layer, either tiled or untiled.  
+     * Create a new Mapguide layer, either tiled or untiled.
      *
-     * For tiled layers, the 'groupName' and 'mapDefinition' values 
+     * For tiled layers, the 'groupName' and 'mapDefinition' values
      * must be specified as parameters in the constructor.
      *
      * For untiled base layers, specify either combination of 'mapName' and
-     * 'session', or 'mapDefinition' and 'locale'.  
+     * 'session', or 'mapDefinition' and 'locale'.
      *
-     * For older versions of MapGuide and overlay layers, set useAsyncOverlay 
-     * to false and in this case mapName and session are required parameters 
+     * For older versions of MapGuide and overlay layers, set useAsyncOverlay
+     * to false and in this case mapName and session are required parameters
      * for the constructor.
      *
-     * NOTE: MapGuide OS uses a DPI value and degrees to meters conversion 
-     * factor that are different than the defaults used in OpenLayers, 
-     * so these must be adjusted accordingly in your application.  
+     * NOTE: MapGuide OS uses a DPI value and degrees to meters conversion
+     * factor that are different than the defaults used in OpenLayers,
+     * so these must be adjusted accordingly in your application.
      * See the MapGuide example for how to set these values for MGOS.
      *
      * Parameters:
@@ -29883,14 +29902,14 @@
      *            (e.g. http://localhost:8008/mapguide/mapagent/mapagent.fcgi)
      * params - {Object} hashtable of additional parameters to use. Some
      *     parameters may require additional code on the server. The ones that
-     *     you may want to use are: 
+     *     you may want to use are:
      *   - mapDefinition - {String} The MapGuide resource definition
      *            (e.g. Library://Samples/Gmap/Maps/gmapTiled.MapDefinition)
-     *   - locale - Locale setting 
+     *   - locale - Locale setting
      *            (for untiled overlays layers only)
      *   - mapName - {String} Name of the map as stored in the MapGuide session.
      *          (for untiled layers with a session parameter only)
-     *   - session - { String} MapGuide session ID 
+     *   - session - { String} MapGuide session ID
      *            (for untiled overlays layers only)
      *   - basemaplayergroupname - {String} GroupName for tiled MapGuide layers only
      *   - format - Image format to be returned (for untiled overlay layers only)
@@ -29904,24 +29923,24 @@
      *       groups to hide eg: 'cvc-xcv34,453-345-345sdf'
      *   - selectionXml - {String} A selection xml string Some server plumbing
      *       is required to read such a value.
-     * options - {Ojbect} Hashtable of extra options to tag onto the layer; 
+     * options - {Ojbect} Hashtable of extra options to tag onto the layer;
      *          will vary depending if tiled or untiled maps are being requested
      */
     initialize: function(name, url, params, options) {
-        
+
         OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments);
-        
-        // unless explicitly set in options, if the layer is transparent, 
+
+        // unless explicitly set in options, if the layer is transparent,
         // it will be an overlay
         if (options == null || options.isBaseLayer == null) {
-            this.isBaseLayer = ((this.transparent != "true") && 
+            this.isBaseLayer = ((this.transparent != "true") &&
                                 (this.transparent != true));
         }
 
         if (options && options.useOverlay!=null) {
           this.useOverlay = options.useOverlay;
         }
-        
+
         //initialize for untiled layers
         if (this.singleTile) {
           if (this.useOverlay) {
@@ -29937,7 +29956,7 @@
                            this.params,
                            this.SINGLE_TILE_PARAMS
                            );
-          }         
+          }
         } else {
             //initialize for tiled layers
             if (this.useHttpTile) {
@@ -29951,7 +29970,7 @@
                                this.TILE_PARAMS
                                );
             }
-            this.setTileSize(this.defaultSize); 
+            this.setTileSize(this.defaultSize);
         }
     },
 
@@ -29977,17 +29996,17 @@
 
     /**
      * Method: addTile
-     * Creates a tile, initializes it, and adds it to the layer div. 
+     * Creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
 
@@ -29996,12 +30015,12 @@
      * Return a query string for this layer
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox 
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox
      *                                for the request
      *
      * Returns:
-     * {String} A string with the layer's url and parameters and also 
-     *          the passed-in bounds and appropriate tile size specified 
+     * {String} A string with the layer's url and parameters and also
+     *          the passed-in bounds and appropriate tile size specified
      *          as parameters.
      */
     getURL: function (bounds) {
@@ -30020,7 +30039,7 @@
             setviewcentery: center.lat,
             setviewscale: this.map.getScale()
           };
-          
+
           if (this.useOverlay && !this.useAsyncOverlay) {
             //first we need to call GETVISIBLEMAPEXTENT to set the extent
             var getVisParams = {};
@@ -30031,7 +30050,7 @@
             getVisParams.mapName = this.params.mapName;
             getVisParams.format = 'text/xml';
             url = this.getFullRequestString( getVisParams );
-            
+
             OpenLayers.Request.GET({url: url, async: false});
           }
           //construct the full URL
@@ -30046,13 +30065,13 @@
           rowidx = Math.round(rowidx/this.tileSize.h);
 
           if (this.useHttpTile){
-	          url = this.getImageFilePath(
+              url = this.getImageFilePath(
                    {
                        tilecol: colidx,
                        tilerow: rowidx,
                        scaleindex: this.resolutions.length - this.map.zoom - 1
                     });
-		  
+
           } else {
             url = this.getFullRequestString(
                    {
@@ -30067,7 +30086,7 @@
 
     /**
      * Method: getFullRequestString
-     * getFullRequestString on MapGuide layers is special, because we 
+     * getFullRequestString on MapGuide layers is special, because we
      * do a regular expression replace on ',' in parameters to '+'.
      * This is why it is subclassed here.
      *
@@ -30080,17 +30099,17 @@
     getFullRequestString:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // if url is not a string, it should be an array of strings, 
+
+        // if url is not a string, it should be an array of strings,
         //  in which case we will randomly select one of them in order
         //  to evenly distribute requests to different urls.
         if (typeof url == "object") {
             url = url[Math.floor(Math.random()*url.length)];
-        }   
+        }
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
-        // create a new params hashtable with all the layer params and the 
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
@@ -30103,7 +30122,7 @@
             }
         }
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         /* MapGuide needs '+' seperating things like bounds/height/width.
            Since typically this is URL encoded, we use a slight hack: we
            depend on the list-like functionality of getParameterString to
@@ -30111,7 +30130,7 @@
            encoded) then do a regular expression replace on the , characters
            to '+' */
         paramsString = paramsString.replace(/,/g, "+");
-        
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -30129,9 +30148,9 @@
         return requestString;
     },
 
-     /** 
+     /**
      * Method: getImageFilePath
-     * special handler to request mapguide tiles from an http exposed tilecache 
+     * special handler to request mapguide tiles from an http exposed tilecache
      *
      * Parameters:
      * altUrl - {String} Alternative base URL to use.
@@ -30142,58 +30161,58 @@
     getImageFilePath:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // if url is not a string, it should be an array of strings, 
+
+        // if url is not a string, it should be an array of strings,
         //  in which case we will randomly select one of them in order
         //  to evenly distribute requests to different urls.
         if (typeof url == "object") {
             url = url[Math.floor(Math.random()*url.length)];
-        }   
+        }
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
         var tileRowGroup = "";
         var tileColGroup = "";
-        
+
         if (newParams.tilerow < 0) {
           tileRowGroup =  '-';
         }
-          
+
         if (newParams.tilerow == 0 ) {
           tileRowGroup += '0';
         } else {
           tileRowGroup += Math.floor(Math.abs(newParams.tilerow/this.params.tileRowsPerFolder)) * this.params.tileRowsPerFolder;
         }
-          
+
         if (newParams.tilecol < 0) {
           tileColGroup =  '-';
         }
-        
+
         if (newParams.tilecol == 0) {
           tileColGroup += '0';
         } else {
           tileColGroup += Math.floor(Math.abs(newParams.tilecol/this.params.tileColumnsPerFolder)) * this.params.tileColumnsPerFolder;
-        }					
-        
+        }
+
         var tilePath = '/S' + Math.floor(newParams.scaleindex)
                 + '/' + this.params.basemaplayergroupname
                 + '/R' + tileRowGroup
                 + '/C' + tileColGroup
-                + '/' + (newParams.tilerow % this.params.tileRowsPerFolder) 
-                + '_' + (newParams.tilecol % this.params.tileColumnsPerFolder) 
+                + '/' + (newParams.tilerow % this.params.tileRowsPerFolder)
+                + '_' + (newParams.tilecol % this.params.tileColumnsPerFolder)
                 + '.' + this.params.format;
-    
+
         if (this.params.querystring) {
                tilePath += "?" + this.params.querystring;
         }
-        
+
         requestString += tilePath;
         return requestString;
     },
-    
-    /** 
+
+    /**
      * Method: calculateGridLayout
-     * Generate parameters for the grid layout. This  
+     * Generate parameters for the grid layout. This
      *
      * Parameters:
      * bounds - {<OpenLayers.Bound>}
@@ -30207,26 +30226,26 @@
     calculateGridLayout: function(bounds, extent, resolution) {
         var tilelon = resolution * this.tileSize.w;
         var tilelat = resolution * this.tileSize.h;
-        
+
         var offsetlon = bounds.left - extent.left;
         var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
         var tilecolremain = offsetlon/tilelon - tilecol;
         var tileoffsetx = -tilecolremain * this.tileSize.w;
         var tileoffsetlon = extent.left + tilecol * tilelon;
-        
-        var offsetlat = extent.top - bounds.top + tilelat; 
+
+        var offsetlat = extent.top - bounds.top + tilelat;
         var tilerow = Math.floor(offsetlat/tilelat) - this.buffer;
         var tilerowremain = tilerow - offsetlat/tilelat;
         var tileoffsety = tilerowremain * this.tileSize.h;
         var tileoffsetlat = extent.top - tilelat*tilerow;
-        
-        return { 
+
+        return {
           tilelon: tilelon, tilelat: tilelat,
           tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
           tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
         };
     },
-    
+
     CLASS_NAME: "OpenLayers.Layer.MapGuide"
 });
 /* ======================================================================
@@ -30253,7 +30272,7 @@
 
     /**
      * Constant: DEFAULT_PARAMS
-     * {Object} Hashtable of default parameter key/value pairs 
+     * {Object} Hashtable of default parameter key/value pairs
      */
     DEFAULT_PARAMS: {
         mode: "map",
@@ -30281,10 +30300,10 @@
             this.params, this.DEFAULT_PARAMS
         );
 
-        // unless explicitly set in options, if the layer is transparent, 
+        // unless explicitly set in options, if the layer is transparent,
         // it will be an overlay
         if (options == null || options.isBaseLayer == null) {
-            this.isBaseLayer = ((this.params.transparent != "true") && 
+            this.isBaseLayer = ((this.params.transparent != "true") &&
                                 (this.params.transparent != true));
         }
     },
@@ -30313,41 +30332,41 @@
 
     /**
      * Method: addTile
-     * Creates a tile, initializes it, and adds it to the layer div. 
+     * Creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
-    
+
     /**
      * Method: getURL
      * Return a query string for this layer
      *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox 
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox
      *                                for the request
      *
      * Returns:
-     * {String} A string with the layer's url and parameters and also 
-     *          the passed-in bounds and appropriate tile size specified 
+     * {String} A string with the layer's url and parameters and also
+     *          the passed-in bounds and appropriate tile size specified
      *          as parameters.
      */
     getURL: function (bounds) {
         bounds = this.adjustBounds(bounds);
-        // Make a list, so that getFullRequestString uses literal "," 
+        // Make a list, so that getFullRequestString uses literal ","
         var extent = [bounds.left, bounds. bottom, bounds.right, bounds.top];
 
-        var imageSize = this.getImageSize(); 
-        
-        // make lists, so that literal ','s are used 
+        var imageSize = this.getImageSize();
+
+        // make lists, so that literal ','s are used
         var url = this.getFullRequestString(
                      {mapext:   extent,
                       imgext:   extent,
@@ -30356,40 +30375,40 @@
                       imgy:     imageSize.h / 2,
                       imgxy:    [imageSize.w, imageSize.h]
                       });
-        
+
         return url;
     },
-    
-    /** 
+
+    /**
      * Method: getFullRequestString
-     * combine the layer's url with its params and these newParams. 
-     *   
+     * combine the layer's url with its params and these newParams.
+     *
      * Parameter:
-     * newParams - {Object} New parameters that should be added to the 
+     * newParams - {Object} New parameters that should be added to the
      *                      request string.
-     * altUrl - {String} (optional) Replace the URL in the full request  
+     * altUrl - {String} (optional) Replace the URL in the full request
      *                              string with the provided URL.
-     * 
-     * Returns: 
+     *
+     * Returns:
      * {String} A string with the layer's url and parameters embedded in it.
      */
     getFullRequestString:function(newParams, altUrl) {
         // use layer's url unless altUrl passed in
         var url = (altUrl == null) ? this.url : altUrl;
-        
-        // create a new params hashtable with all the layer params and the 
+
+        // create a new params hashtable with all the layer params and the
         // new params together. then convert to string
         var allParams = OpenLayers.Util.extend({}, this.params);
         allParams = OpenLayers.Util.extend(allParams, newParams);
         var paramsString = OpenLayers.Util.getParameterString(allParams);
-        
-        // if url is not a string, it should be an array of strings, 
-        // in which case we will deterministically select one of them in 
+
+        // if url is not a string, it should be an array of strings,
+        // in which case we will deterministically select one of them in
         // order to evenly distribute requests to different urls.
         if (url instanceof Array) {
             url = this.selectUrl(paramsString, url);
-        }   
-        
+        }
+
         // ignore parameters that are already in the url search string
         var urlParams = OpenLayers.Util.upperCaseObject(
                             OpenLayers.Util.getParameters(url));
@@ -30399,9 +30418,9 @@
             }
         }
         paramsString = OpenLayers.Util.getParameterString(allParams);
-        
+
         // requestString always starts with url
-        var requestString = url;        
+        var requestString = url;
 
         // MapServer needs '+' seperating things like bounds/height/width.
         //   Since typically this is URL encoded, we use a slight hack: we
@@ -30411,7 +30430,7 @@
         //  to '+'
         //
         paramsString = paramsString.replace(/,/g, "+");
-        
+
         if (paramsString != "") {
             var lastServerChar = url.charAt(url.length - 1);
             if ((lastServerChar == "&") || (lastServerChar == "?")) {
@@ -30450,7 +30469,7 @@
  * Instances of OpenLayers.Layer.WMS are used to display data from OGC Web
  *     Mapping Services. Create a new WMS layer with the <OpenLayers.Layer.WMS>
  *     constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Layer.Grid>
  */
@@ -30458,7 +30477,7 @@
 
     /**
      * Constant: DEFAULT_PARAMS
-     * {Object} Hashtable of default parameter key/value pairs 
+     * {Object} Hashtable of default parameter key/value pairs
      */
     DEFAULT_PARAMS: { service: "WMS",
                       version: "1.1.1",
@@ -30467,48 +30486,48 @@
                       exceptions: "application/vnd.ogc.se_inimage",
                       format: "image/jpeg"
                      },
-    
+
     /**
      * Property: reproject
      * *Deprecated*. See http://trac.openlayers.org/wiki/SphericalMercator
-     * for information on the replacement for this functionality. 
+     * for information on the replacement for this functionality.
      * {Boolean} Try to reproject this layer if its coordinate reference system
-     *           is different than that of the base layer.  Default is true.  
-     *           Set this in the layer options.  Should be set to false in 
+     *           is different than that of the base layer.  Default is true.
+     *           Set this in the layer options.  Should be set to false in
      *           most cases.
      */
     reproject: false,
- 
+
     /**
      * APIProperty: isBaseLayer
      * {Boolean} Default is true for WMS layer
      */
     isBaseLayer: true,
-    
+
     /**
      * APIProperty: encodeBBOX
-     * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no', 
+     * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no',
      * but some services want it that way. Default false.
      */
     encodeBBOX: false,
-    
-    /** 
-     * APIProperty: noMagic 
-     * {Boolean} If true, the image format will not be automagicaly switched 
-     *     from image/jpeg to image/png or image/gif when using 
-     *     TRANSPARENT=TRUE. Also isBaseLayer will not changed by the  
-     *     constructor. Default false. 
-     */ 
-    noMagic: false,  
-    
+
     /**
+     * APIProperty: noMagic
+     * {Boolean} If true, the image format will not be automagicaly switched
+     *     from image/jpeg to image/png or image/gif when using
+     *     TRANSPARENT=TRUE. Also isBaseLayer will not changed by the
+     *     constructor. Default false.
+     */
+    noMagic: false,
+
+    /**
      * Constructor: OpenLayers.Layer.WMS
      * Create a new WMS layer object
      *
      * Example:
      * (code)
      * var wms = new OpenLayers.Layer.WMS("NASA Global Mosaic",
-     *                                    "http://wms.jpl.nasa.gov/wms.cgi", 
+     *                                    "http://wms.jpl.nasa.gov/wms.cgi",
      *                                    {layers: "modis,global_mosaic"});
      * (end)
      *
@@ -30527,21 +30546,21 @@
         newArguments.push(name, url, params, options);
         OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
         OpenLayers.Util.applyDefaults(
-                       this.params, 
+                       this.params,
                        OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
                        );
 
 
-        //layer is transparent        
-        if (!this.noMagic && this.params.TRANSPARENT && 
+        //layer is transparent
+        if (!this.noMagic && this.params.TRANSPARENT &&
             this.params.TRANSPARENT.toString().toLowerCase() == "true") {
-            
+
             // unless explicitly set in options, make layer an overlay
             if ( (options == null) || (!options.isBaseLayer) ) {
                 this.isBaseLayer = false;
-            } 
-            
-            // jpegs can never be transparent, so intelligently switch the 
+            }
+
+            // jpegs can never be transparent, so intelligently switch the
             //  format, depending on teh browser's capabilities
             if (this.params.FORMAT == "image/jpeg") {
                 this.params.FORMAT = OpenLayers.Util.alphaHack() ? "image/gif"
@@ -30549,18 +30568,18 @@
             }
         }
 
-    },    
+    },
 
     /**
      * Method: destroy
      * Destroy this layer
      */
     destroy: function() {
-        // for now, nothing special to do here. 
-        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+        // for now, nothing special to do here.
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);
     },
 
-    
+
     /**
      * Method: clone
      * Create a clone of this layer
@@ -30569,7 +30588,7 @@
      * {<OpenLayers.Layer.WMS>} An exact clone of this layer
      */
     clone: function (obj) {
-        
+
         if (obj == null) {
             obj = new OpenLayers.Layer.WMS(this.name,
                                            this.url,
@@ -30583,8 +30602,8 @@
         // copy/set any non-init, non-simple values here
 
         return obj;
-    },    
-    
+    },
+
     /**
      * Method: getURL
      * Return a GetMap query string for this layer
@@ -30595,13 +30614,13 @@
      *
      * Returns:
      * {String} A string with the layer's url and parameters and also the
-     *          passed-in bounds and appropriate tile size specified as 
+     *          passed-in bounds and appropriate tile size specified as
      *          parameters.
      */
     getURL: function (bounds) {
         bounds = this.adjustBounds(bounds);
-        
-        var imageSize = this.getImageSize(); 
+
+        var imageSize = this.getImageSize();
         var newParams = {
             'BBOX': this.encodeBBOX ?  bounds.toBBOX() : bounds.toArray(),
             'WIDTH': imageSize.w,
@@ -30613,17 +30632,17 @@
 
     /**
      * Method: addTile
-     * addTile creates a tile, initializes it, and adds it to the layer div. 
+     * addTile creates a tile, initializes it, and adds it to the layer div.
      *
      * Parameters:
      * bounds - {<OpenLayers.Bounds>}
      * position - {<OpenLayers.Pixel>}
-     * 
+     *
      * Returns:
      * {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image
      */
     addTile:function(bounds,position) {
-        return new OpenLayers.Tile.Image(this, position, bounds, 
+        return new OpenLayers.Tile.Image(this, position, bounds,
                                          null, this.tileSize);
     },
 
@@ -30631,34 +30650,34 @@
      * APIMethod: mergeNewParams
      * Catch changeParams and uppercase the new params to be merged in
      *     before calling changeParams on the super class.
-     * 
+     *
      *     Once params have been changed, the tiles will be reloaded with
      *     the new parameters.
-     * 
+     *
      * Parameters:
      * newParams - {Object} Hashtable of new params to use
      */
     mergeNewParams:function(newParams) {
         var upperParams = OpenLayers.Util.upperCaseObject(newParams);
         var newArguments = [upperParams];
-        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, 
+        return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,
                                                              newArguments);
     },
 
-    /** 
+    /**
      * APIMethod: getFullRequestString
-     * Combine the layer's url with its params and these newParams. 
-     *   
+     * Combine the layer's url with its params and these newParams.
+     *
      *     Add the SRS parameter from projection -- this is probably
-     *     more eloquently done via a setProjection() method, but this 
+     *     more eloquently done via a setProjection() method, but this
      *     works for now and always.
      *
      * Parameters:
      * newParams - {Object}
      * altUrl - {String} Use this as the url instead of the layer's url
-     * 
+     *
      * Returns:
-     * {String} 
+     * {String}
      */
     getFullRequestString:function(newParams, altUrl) {
         var projectionCode = this.map.getProjection();
@@ -30675,7 +30694,7 @@
    ====================================================================== */
 
 /* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
  * for the full text of the license. */
 
 
@@ -30689,25 +30708,25 @@
  * This class represents an SLD Rule, as being used for rule-based SLD styling.
  */
 OpenLayers.Rule = OpenLayers.Class({
-    
+
     /**
      * Property: id
      * {String} A unique id for this session.
      */
     id: null,
-    
+
     /**
      * APIProperty: name
      * {String} name of this rule
      */
     name: 'default',
-    
+
     /**
      * Property: title
      * {String} Title of this rule (set if included in SLD)
      */
     title: null,
-    
+
     /**
      * Property: description
      * {String} Description of this rule (set if abstract is included in SLD)
@@ -30721,7 +30740,7 @@
      * be used.
      */
     context: null,
-    
+
     /**
      * Property: filter
      * {<OpenLayers.Filter>} Optional filter for the rule.
@@ -30731,13 +30750,13 @@
     /**
      * Property: elseFilter
      * {Boolean} Determines whether this rule is only to be applied only if
-     * no other rules match (ElseFilter according to the SLD specification). 
+     * no other rules match (ElseFilter according to the SLD specification).
      * Default is false.  For instances of OpenLayers.Rule, if elseFilter is
-     * false, the rule will always apply.  For subclasses, the else property is 
+     * false, the rule will always apply.  For subclasses, the else property is
      * ignored.
      */
     elseFilter: false,
-    
+
     /**
      * Property: symbolizer
      * {Object} Symbolizer or hash of symbolizers for this rule. If hash of
@@ -30748,7 +30767,7 @@
      * SLD.
      */
     symbolizer: null,
-    
+
     /**
      * APIProperty: minScaleDenominator
      * {Number} or {String} minimum scale at which to draw the feature.
@@ -30764,15 +30783,15 @@
      * propertyNames in the form "literal ${propertyName}"
      */
     maxScaleDenominator: null,
-    
-    /** 
+
+    /**
      * Constructor: OpenLayers.Rule
      * Creates a Rule.
      *
      * Parameters:
      * options - {Object} An optional object with properties to set on the
      *           rule
-     * 
+     *
      * Returns:
      * {<OpenLayers.Rule>}
      */
@@ -30782,7 +30801,7 @@
         this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
     },
 
-    /** 
+    /**
      * APIMethod: destroy
      * nullify references to prevent circular references and memory leaks
      */
@@ -30792,14 +30811,14 @@
         }
         this.symbolizer = null;
     },
-    
+
     /**
      * APIMethod: evaluate
      * evaluates this rule for a specific feature
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} feature to apply the rule to.
-     * 
+     *
      * Returns:
      * {Boolean} true if the rule applies, false if it does not.
      * This rule is the default rule and always returns true.
@@ -30811,7 +30830,7 @@
         if (this.minScaleDenominator || this.maxScaleDenominator) {
             var scale = feature.layer.map.getScale();
         }
-        
+
         // check if within minScale/maxScale bounds
         if (this.minScaleDenominator) {
             applies = scale >= OpenLayers.Style.createLiteral(
@@ -30821,7 +30840,7 @@
             applies = scale < OpenLayers.Style.createLiteral(
                     this.maxScaleDenominator, context);
         }
-        
+
         // check if optional filter applies
         if(applies && this.filter) {
             // feature id filters get the feature, others get the context
@@ -30834,11 +30853,11 @@
 
         return applies;
     },
-    
+
     /**
      * Method: getContext
      * Gets the context for evaluating this rule
-     * 
+     *
      * Paramters:
      * feature - {<OpenLayers.Feature>} feature to take the context from if
      *           none is specified.
@@ -30853,11 +30872,11 @@
         }
         return context;
     },
-    
+
     /**
      * APIMethod: clone
      * Clones this rule.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Rule>} Clone of this rule.
      */
@@ -30880,7 +30899,7 @@
         options.context = this.context && OpenLayers.Util.extend({}, this.context);
         return new OpenLayers.Rule(options);
     },
-        
+
     CLASS_NAME: "OpenLayers.Rule"
 });
 /* ======================================================================
@@ -30895,19 +30914,19 @@
  * @requires OpenLayers/Style.js
  * @requires OpenLayers/Feature/Vector.js
  */
- 
+
 /**
  * Class: OpenLayers.StyleMap
  */
 OpenLayers.StyleMap = OpenLayers.Class({
-    
+
     /**
      * Property: styles
      * Hash of {<OpenLayers.Style>}, keyed by names of well known
      * rendering intents (e.g. "default", "temporary", "select", "delete").
      */
     styles: null,
-    
+
     /**
      * Property: extendDefault
      * {Boolean} if true, every render intent will extend the symbolizers
@@ -30915,10 +30934,10 @@
      * rendering intent will be treated as a completely independent style.
      */
     extendDefault: true,
-    
+
     /**
      * Constructor: OpenLayers.StyleMap
-     * 
+     *
      * Parameters:
      * style   - {Object} Optional. Either a style hash, or a style object, or
      *           a hash of style objects (style hashes) keyed by rendering
@@ -30939,7 +30958,7 @@
             "delete": new OpenLayers.Style(
                 OpenLayers.Feature.Vector.style["delete"])
         };
-        
+
         // take whatever the user passed as style parameter and convert it
         // into parts of stylemap.
         if(style instanceof OpenLayers.Style) {
@@ -30978,11 +30997,11 @@
         }
         this.styles = null;
     },
-    
+
     /**
      * Method: createSymbolizer
      * Creates the symbolizer for a feature for a render intent.
-     * 
+     *
      * Parameters:
      * feature - {<OpenLayers.Feature>} The feature to evaluate the rules
      *           of the intended style against.
@@ -30990,7 +31009,7 @@
      *           used to draw the feature. Well known intents are "default"
      *           (for just drawing the features), "select" (for selected
      *           features) and "temporary" (for drawing features).
-     * 
+     *
      * Returns:
      * {Object} symbolizer hash
      */
@@ -31009,20 +31028,20 @@
         return OpenLayers.Util.extend(defaultSymbolizer,
             this.styles[intent].createSymbolizer(feature));
     },
-    
+
     /**
      * Method: addUniqueValueRules
      * Convenience method to create comparison rules for unique values of a
      * property. The rules will be added to the style object for a specified
      * rendering intent. This method is a shortcut for creating something like
      * the "unique value legends" familiar from well known desktop GIS systems
-     * 
+     *
      * Parameters:
      * renderIntent - {String} rendering intent to add the rules to
      * property     - {String} values of feature attributes to create the
      *                rules for
      * symbolizers  - {Object} Hash of symbolizers, keyed by the desired
-     *                property values 
+     *                property values
      * context      - {Object} An optional object with properties that
      *                symbolizers' property values should be evaluated
      *                against. If no context is specified, feature.attributes
@@ -31060,21 +31079,21 @@
 
 /**
  * Class: OpenLayers.Geometry.Collection
- * A Collection is exactly what it sounds like: A collection of different 
+ * A Collection is exactly what it sounds like: A collection of different
  * Geometries. These are stored in the local parameter <components> (which
- * can be passed as a parameter to the constructor). 
- * 
- * As new geometries are added to the collection, they are NOT cloned. 
- * When removing geometries, they need to be specified by reference (ie you 
+ * can be passed as a parameter to the constructor).
+ *
+ * As new geometries are added to the collection, they are NOT cloned.
+ * When removing geometries, they need to be specified by reference (ie you
  * have to pass in the *exact* geometry to be removed).
- * 
+ *
  * The <getArea> and <getLength> functions here merely iterate through
  * the components, summing their respective areas and lengths.
  *
  * Create a new instance with the <OpenLayers.Geometry.Collection> constructor.
  *
  * Inerhits from:
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Collection = OpenLayers.Class(OpenLayers.Geometry, {
 
@@ -31083,7 +31102,7 @@
      * {Array(<OpenLayers.Geometry>)} The component parts of this geometry
      */
     components: null,
-    
+
     /**
      * Property: componentTypes
      * {Array(String)} An array of class names representing the types of
@@ -31096,7 +31115,7 @@
      * Constructor: OpenLayers.Geometry.Collection
      * Creates a Geometry Collection -- a list of geoms.
      *
-     * Parameters: 
+     * Parameters:
      * components - {Array(<OpenLayers.Geometry>)} Optional array of geometries
      *
      */
@@ -31129,31 +31148,31 @@
         for(var i=0, len=this.components.length; i<len; i++) {
             geometry.addComponent(this.components[i].clone());
         }
-        
+
         // catch any randomly tagged-on properties
         OpenLayers.Util.applyDefaults(geometry, this);
-        
+
         return geometry;
     },
 
     /**
      * Method: getComponentsString
      * Get a string representing the components for this collection
-     * 
+     *
      * Returns:
      * {String} A string representation of the components of this geometry
      */
     getComponentsString: function(){
         var strings = [];
         for(var i=0, len=this.components.length; i<len; i++) {
-            strings.push(this.components[i].toShortString()); 
+            strings.push(this.components[i].toShortString());
         }
         return strings.join(",");
     },
 
     /**
      * APIMethod: calculateBounds
-     * Recalculate the bounds by iterating through the components and 
+     * Recalculate the bounds by iterating through the components and
      * calling calling extendBounds() on each item.
      */
     calculateBounds: function() {
@@ -31188,14 +31207,14 @@
      * is set, then the component class name must be in the componentTypes array.
      *
      * The bounds cache is reset.
-     * 
+     *
      * Parameters:
      * component - {<OpenLayers.Geometry>} A geometry to add
      * index - {int} Optional index into the array to insert the component
      *
      * Returns:
      * {Boolean} The component geometry was successfully added
-     */    
+     */
     addComponent: function(component, index) {
         var added = false;
         if(component) {
@@ -31205,7 +31224,7 @@
 
                 if(index != null && (index < this.components.length)) {
                     var components1 = this.components.slice(0, index);
-                    var components2 = this.components.slice(index, 
+                    var components2 = this.components.slice(index,
                                                            this.components.length);
                     components1.push(component);
                     this.components = components1.concat(components2);
@@ -31219,7 +31238,7 @@
         }
         return added;
     },
-    
+
     /**
      * APIMethod: removeComponents
      * Remove components from this geometry.
@@ -31235,18 +31254,18 @@
             this.removeComponent(components[i]);
         }
     },
-    
+
     /**
      * Method: removeComponent
      * Remove a component from this geometry.
      *
      * Parameters:
-     * component - {<OpenLayers.Geometry>} 
+     * component - {<OpenLayers.Geometry>}
      */
     removeComponent: function(component) {
-        
+
         OpenLayers.Util.removeItem(this.components, component);
-        
+
         // clearBounds() so that it gets recalculated on the next call
         // to this.getBounds();
         this.clearBounds();
@@ -31266,7 +31285,7 @@
         }
         return length;
     },
-    
+
     /**
      * APIMethod: getArea
      * Calculate the area of this geometry. Note how this function is overridden
@@ -31283,7 +31302,7 @@
         return area;
     },
 
-    /** 
+    /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
      *     the earth.
@@ -31292,7 +31311,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -31308,7 +31327,7 @@
         }
         return area;
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -31338,7 +31357,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Returns:
      * {Float} The appoximate geodesic length of the geometry in meters.
      */
@@ -31357,7 +31376,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -31393,9 +31412,9 @@
      *                 will have four times the area).
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         for(var i=0; i<this.components.length; ++i) {
@@ -31450,13 +31469,13 @@
         return best;
     },
 
-    /** 
+    /**
      * APIMethod: equals
      * Determine whether another geometry is equivalent to this one.  Geometries
      *     are considered equivalent if all components have the same coordinates.
-     * 
+     *
      * Parameters:
-     * geom - {<OpenLayers.Geometry>} The geometry to test. 
+     * geom - {<OpenLayers.Geometry>} The geometry to test.
      *
      * Returns:
      * {Boolean} The supplied geometry is equivalent to this geometry.
@@ -31483,17 +31502,17 @@
     /**
      * APIMethod: transform
      * Reproject the components geometry from source to dest.
-     * 
+     *
      * Parameters:
-     * source - {<OpenLayers.Projection>} 
+     * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if (source && dest) {
-            for (var i=0, len=this.components.length; i<len; i++) {  
+            for (var i=0, len=this.components.length; i<len; i++) {
                 var component = this.components[i];
                 component.transform(source, dest);
             }
@@ -31563,22 +31582,22 @@
 
 /**
  * Class: OpenLayers.Geometry.Point
- * Point geometry class. 
- * 
+ * Point geometry class.
+ *
  * Inherits from:
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
 
-    /** 
-     * APIProperty: x 
-     * {float} 
+    /**
+     * APIProperty: x
+     * {float}
      */
     x: null,
 
-    /** 
-     * APIProperty: y 
-     * {float} 
+    /**
+     * APIProperty: y
+     * {float}
      */
     y: null,
 
@@ -31587,20 +31606,20 @@
      * Construct a point geometry.
      *
      * Parameters:
-     * x - {float} 
+     * x - {float}
      * y - {float}
-     * 
+     *
      */
     initialize: function(x, y) {
         OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
-        
+
         this.x = parseFloat(x);
         this.y = parseFloat(y);
     },
 
     /**
      * APIMethod: clone
-     * 
+     *
      * Returns:
      * {<OpenLayers.Geometry.Point>} An exact clone of this OpenLayers.Geometry.Point
      */
@@ -31615,7 +31634,7 @@
         return obj;
     },
 
-    /** 
+    /**
      * Method: calculateBounds
      * Create a new Bounds based on the lon/lat
      */
@@ -31676,14 +31695,14 @@
         }
         return result;
     },
-    
-    /** 
+
+    /**
      * APIMethod: equals
      * Determine whether another geometry is equivalent to this one.  Geometries
      *     are considered equivalent if all components have the same coordinates.
-     * 
+     *
      * Parameters:
-     * geom - {<OpenLayers.Geometry.Point>} The geometry to test. 
+     * geom - {<OpenLayers.Geometry.Point>} The geometry to test.
      *
      * Returns:
      * {Boolean} The supplied geometry is equivalent to this geometry.
@@ -31696,18 +31715,18 @@
         }
         return equals;
     },
-    
+
     /**
      * Method: toShortString
      *
      * Returns:
-     * {String} Shortened String representation of Point object. 
+     * {String} Shortened String representation of Point object.
      *         (ex. <i>"5, 42"</i>)
      */
     toShortString: function() {
         return (this.x + ", " + this.y);
     },
-    
+
     /**
      * APIMethod: move
      * Moves a geometry by the given displacement along positive x and y axes.
@@ -31715,7 +31734,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -31741,7 +31760,7 @@
         this.y = origin.y + (radius * Math.sin(theta));
         this.clearBounds();
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -31764,9 +31783,9 @@
      *                 distance between the point and origin.
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         ratio = (ratio == undefined) ? 1 : ratio;
@@ -31775,7 +31794,7 @@
         this.clearBounds();
         return this;
     },
-    
+
     /**
      * APIMethod: intersects
      * Determine if the input geometry intersects this one.
@@ -31795,24 +31814,24 @@
         }
         return intersect;
     },
-    
+
     /**
      * APIMethod: transform
      * Translate the x,y properties of the point from source to dest.
-     * 
+     *
      * Parameters:
-     * source - {<OpenLayers.Projection>} 
+     * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if ((source && dest)) {
             OpenLayers.Projection.transform(
-                this, source, dest); 
+                this, source, dest);
             this.bounds = null;
-        }       
+        }
         return this;
     },
 
@@ -31907,14 +31926,14 @@
      * featureunselected - Triggered after a feature is unselected.
      *      Listeners will receive an object with a *feature* property
      *      referencing the unselected feature.
-     * beforefeaturemodified - Triggered when a feature is selected to 
-     *      be modified.  Listeners will receive an object with a *feature* 
+     * beforefeaturemodified - Triggered when a feature is selected to
+     *      be modified.  Listeners will receive an object with a *feature*
      *      property referencing the selected feature.
      * featuremodified - Triggered when a feature has been modified.
-     *      Listeners will receive an object with a *feature* property referencing 
+     *      Listeners will receive an object with a *feature* property referencing
      *      the modified feature.
      * afterfeaturemodified - Triggered when a feature is finished being modified.
-     *      Listeners will receive an object with a *feature* property referencing 
+     *      Listeners will receive an object with a *feature* property referencing
      *      the modified feature.
      * vertexmodified - Triggered when a vertex within any feature geometry
      *      has been modified.  Listeners will receive an object with a
@@ -31940,7 +31959,7 @@
     EVENT_TYPES: ["beforefeatureadded", "beforefeaturesadded",
                   "featureadded", "featuresadded",
                   "beforefeatureremoved", "featureremoved", "featuresremoved",
-                  "beforefeatureselected", "featureselected", "featureunselected", 
+                  "beforefeatureselected", "featureselected", "featureunselected",
                   "beforefeaturemodified", "featuremodified", "afterfeaturemodified",
                   "vertexmodified", "sketchstarted", "sketchmodified",
                   "sketchcomplete", "refresh"],
@@ -31952,31 +31971,31 @@
      */
     isBaseLayer: false,
 
-    /** 
+    /**
      * APIProperty: isFixed
      * {Boolean} Whether the layer remains in one place while dragging the
      * map.
      */
     isFixed: false,
 
-    /** 
+    /**
      * APIProperty: isVector
      * {Boolean} Whether the layer is a vector layer.
      */
     isVector: true,
-    
-    /** 
+
+    /**
      * APIProperty: features
-     * {Array(<OpenLayers.Feature.Vector>)} 
+     * {Array(<OpenLayers.Feature.Vector>)}
      */
     features: null,
-    
-    /** 
+
+    /**
      * Property: selectedFeatures
-     * {Array(<OpenLayers.Feature.Vector>)} 
+     * {Array(<OpenLayers.Feature.Vector>)}
      */
     selectedFeatures: null,
-    
+
     /**
      * Property: unrenderedFeatures
      * {Object} hash of features, keyed by feature.id, that the renderer
@@ -31989,32 +32008,32 @@
      * {Boolean} report friendly error message when loading of renderer
      * fails.
      */
-    reportError: true, 
+    reportError: true,
 
-    /** 
+    /**
      * APIProperty: style
      * {Object} Default style for the layer
      */
     style: null,
-    
+
     /**
      * Property: styleMap
      * {<OpenLayers.StyleMap>}
      */
     styleMap: null,
-    
+
     /**
      * Property: strategies
      * {Array(<OpenLayers.Strategy>})} Optional list of strategies for the layer.
      */
     strategies: null,
-    
+
     /**
      * Property: protocol
      * {<OpenLayers.Protocol>} Optional protocol for the layer.
      */
     protocol: null,
-    
+
     /**
      * Property: renderers
      * {Array(String)} List of supported Renderer classes. Add to this list to
@@ -32023,21 +32042,21 @@
      * method will be used, if not defined in the 'renderer' option.
      */
     renderers: ['SVG', 'VML', 'Canvas'],
-    
-    /** 
+
+    /**
      * Property: renderer
      * {<OpenLayers.Renderer>}
      */
     renderer: null,
-    
+
     /**
      * APIProperty: rendererOptions
      * {Object} Options for the renderer. See {<OpenLayers.Renderer>} for
      *     supported options.
      */
     rendererOptions: null,
-    
-    /** 
+
+    /**
      * APIProperty: geometryType
      * {String} geometryType allows you to limit the types of geometries this
      * layer supports. This should be set to something like
@@ -32045,7 +32064,7 @@
      */
     geometryType: null,
 
-    /** 
+    /**
      * Property: drawn
      * {Boolean} Whether the Vector Layer features have been drawn yet.
      */
@@ -32064,7 +32083,7 @@
      * {<OpenLayers.Layer.Vector>} A new vector layer
      */
     initialize: function(name, options) {
-        
+
         // concatenate events specific to vector with those from the base
         this.EVENT_TYPES =
             OpenLayers.Layer.Vector.prototype.EVENT_TYPES.concat(
@@ -32074,7 +32093,7 @@
         OpenLayers.Layer.prototype.initialize.apply(this, arguments);
 
         // allow user-set renderer, otherwise assign one
-        if (!this.renderer || !this.renderer.supported()) {  
+        if (!this.renderer || !this.renderer.supported()) {
             this.assignRenderer();
         }
 
@@ -32082,7 +32101,7 @@
         if (!this.renderer || !this.renderer.supported()) {
             this.renderer = null;
             this.displayError();
-        } 
+        }
 
         if (!this.styleMap) {
             this.styleMap = new OpenLayers.StyleMap();
@@ -32091,7 +32110,7 @@
         this.features = [];
         this.selectedFeatures = [];
         this.unrenderedFeatures = {};
-        
+
         // Allow for custom layer behavior
         if(this.strategies){
             for(var i=0, len=this.strategies.length; i<len; i++) {
@@ -32132,7 +32151,7 @@
         this.renderer = null;
         this.geometryType = null;
         this.drawn = null;
-        OpenLayers.Layer.prototype.destroy.apply(this, arguments);  
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
     },
 
     /**
@@ -32150,11 +32169,11 @@
         }
     },
 
-    /** 
+    /**
      * Method: assignRenderer
-     * Iterates through the available renderer implementations and selects 
+     * Iterates through the available renderer implementations and selects
      * and assigns the first one whose "supported()" function returns true.
-     */    
+     */
     assignRenderer: function()  {
         for (var i=0, len=this.renderers.length; i<len; i++) {
             var rendererClass = OpenLayers.Renderer[this.renderers[i]];
@@ -32162,32 +32181,32 @@
                 this.renderer = new rendererClass(this.div,
                     this.rendererOptions);
                 break;
-            }  
-        }  
+            }
+        }
     },
 
-    /** 
-     * Method: displayError 
+    /**
+     * Method: displayError
      * Let the user know their browser isn't supported.
      */
     displayError: function() {
         if (this.reportError) {
-            OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported", 
+            OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported",
                                      {'renderers':this.renderers.join("\n")}));
-        }    
+        }
     },
 
-    /** 
+    /**
      * Method: setMap
-     * The layer has been added to the map. 
-     * 
+     * The layer has been added to the map.
+     *
      * If there is no renderer set, the layer can't be used. Remove it.
      * Otherwise, give the renderer a reference to the map and set its size.
-     * 
+     *
      * Parameters:
-     * map - {<OpenLayers.Map>} 
+     * map - {<OpenLayers.Map>}
      */
-    setMap: function(map) {        
+    setMap: function(map) {
         OpenLayers.Layer.prototype.setMap.apply(this, arguments);
 
         if (!this.renderer) {
@@ -32234,11 +32253,11 @@
             }
         }
     },
-    
+
     /**
      * Method: onMapResize
-     * Notify the renderer of the change in size. 
-     * 
+     * Notify the renderer of the change in size.
+     *
      */
     onMapResize: function() {
         OpenLayers.Layer.prototype.onMapResize.apply(this, arguments);
@@ -32247,32 +32266,32 @@
 
     /**
      * Method: moveTo
-     *  Reset the vector layer's div so that it once again is lined up with 
+     *  Reset the vector layer's div so that it once again is lined up with
      *   the map. Notify the renderer of the change of extent, and in the
-     *   case of a change of zoom level (resolution), have the 
+     *   case of a change of zoom level (resolution), have the
      *   renderer redraw features.
-     * 
-     *  If the layer has not yet been drawn, cycle through the layer's 
+     *
+     *  If the layer has not yet been drawn, cycle through the layer's
      *   features and draw each one.
-     * 
+     *
      * Parameters:
-     * bounds - {<OpenLayers.Bounds>} 
-     * zoomChanged - {Boolean} 
-     * dragging - {Boolean} 
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
      */
     moveTo: function(bounds, zoomChanged, dragging) {
         OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
-        
+
         var coordSysUnchanged = true;
 
         if (!dragging) {
             this.renderer.root.style.visibility = "hidden";
-            
+
             this.div.style.left = -parseInt(this.map.layerContainerDiv.style.left) + "px";
             this.div.style.top = -parseInt(this.map.layerContainerDiv.style.top) + "px";
             var extent = this.map.getExtent();
             coordSysUnchanged = this.renderer.setExtent(extent, zoomChanged);
-            
+
             this.renderer.root.style.visibility = "visible";
 
             // Force a reflow on gecko based browsers to prevent jump/flicker.
@@ -32281,7 +32300,7 @@
             if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) {
                 this.div.scrollLeft = this.div.scrollLeft;
             }
-            
+
             if(!zoomChanged && coordSysUnchanged) {
                 for(var i in this.unrenderedFeatures) {
                     var feature = this.unrenderedFeatures[i];
@@ -32289,7 +32308,7 @@
                 }
             }
         }
-        
+
         if (!this.drawn || zoomChanged || !coordSysUnchanged) {
             this.drawn = true;
             var feature;
@@ -32298,13 +32317,13 @@
                 feature = this.features[i];
                 this.drawFeature(feature);
             }
-        }    
+        }
     },
-    
-    /** 
+
+    /**
      * APIMethod: display
      * Hide or show the Layer
-     * 
+     *
      * Parameters:
      * display - {Boolean}
      */
@@ -32323,14 +32342,14 @@
      * Add Features to the layer.
      *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      * options - {Object}
      */
     addFeatures: function(features, options) {
         if (!(features instanceof Array)) {
             features = [features];
         }
-        
+
         var notify = !options || !options.silent;
         if(notify) {
             var event = {features: features};
@@ -32340,16 +32359,16 @@
             }
             features = event.features;
         }
-        
 
+
         for (var i=0, len=features.length; i<len; i++) {
             if (i != (features.length - 1)) {
                 this.renderer.locked = true;
             } else {
                 this.renderer.locked = false;
-            }    
+            }
             var feature = features[i];
-            
+
             if (this.geometryType &&
               !(feature.geometry instanceof this.geometryType)) {
                 var throwStr = OpenLayers.i18n('componentShouldBe',
@@ -32358,7 +32377,7 @@
               }
 
             this.features.push(feature);
-            
+
             //give feature reference to its layer
             feature.layer = this;
 
@@ -32375,7 +32394,7 @@
             }
 
             this.drawFeature(feature);
-            
+
             if (notify) {
                 this.events.triggerEvent("featureadded", {
                     feature: feature
@@ -32383,7 +32402,7 @@
                 this.onFeatureInsert(feature);
             }
         }
-        
+
         if(notify) {
             this.events.triggerEvent("featuresadded", {features: features});
         }
@@ -32397,7 +32416,7 @@
      *     and featureremoved events will be triggered for each feature.  The
      *     featuresremoved event will be triggered after all features have
      *     been removed.  To supress event triggering, use the silent option.
-     * 
+     *
      * Parameters:
      * features - {Array(<OpenLayers.Feature.Vector>)} List of features to be
      *     removed.
@@ -32426,15 +32445,15 @@
             // because if all the features after the current one are 'null', we
             // won't call eraseGeometry, so we break the 'renderer functions
             // will always be called with locked=false *last*' rule. The end result
-            // is a possible gratiutious unlocking to save a loop through the rest 
+            // is a possible gratiutious unlocking to save a loop through the rest
             // of the list checking the remaining features every time. So long as
-            // null geoms are rare, this is probably okay.    
+            // null geoms are rare, this is probably okay.
             if (i != 0 && features[i-1].geometry) {
                 this.renderer.locked = true;
             } else {
                 this.renderer.locked = false;
             }
-    
+
             var feature = features[i];
             delete this.unrenderedFeatures[feature.id];
 
@@ -32451,8 +32470,8 @@
             if (feature.geometry) {
                 this.renderer.eraseFeatures(feature);
             }
-                    
-            //in the case that this feature is one of the selected features, 
+
+            //in the case that this feature is one of the selected features,
             // remove it from that array as well.
             if (OpenLayers.Util.indexOf(this.selectedFeatures, feature) != -1){
                 OpenLayers.Util.removeItem(this.selectedFeatures, feature);
@@ -32500,20 +32519,20 @@
      * is included, this style will be used.  If no style is included, the
      * feature's style will be used.  If the feature doesn't have a style,
      * the layer's style will be used.
-     * 
-     * This function is not designed to be used when adding features to 
+     *
+     * This function is not designed to be used when adding features to
      * the layer (use addFeatures instead). It is meant to be used when
-     * the style of a feature has changed, or in some other way needs to 
+     * the style of a feature has changed, or in some other way needs to
      * visually updated *after* it has already been added to a layer. You
-     * must add the feature to the layer for most layer-related events to 
+     * must add the feature to the layer for most layer-related events to
      * happen.
      *
-     * Parameters: 
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
      * style - {Object} Symbolizer hash or {String} renderIntent
      */
     drawFeature: function(feature, style) {
-        // don't try to draw the feature with the renderer if the layer is not 
+        // don't try to draw the feature with the renderer if the layer is not
         // drawn itself
         if (!this.drawn) {
             return
@@ -32528,20 +32547,20 @@
                 style = this.styleMap.createSymbolizer(feature, renderIntent);
             }
         }
-        
+
         if (!this.renderer.drawFeature(feature, style)) {
             this.unrenderedFeatures[feature.id] = feature;
         } else {
             delete this.unrenderedFeatures[feature.id];
         };
     },
-    
+
     /**
      * Method: eraseFeatures
      * Erase features from the layer.
      *
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * features - {Array(<OpenLayers.Feature.Vector>)}
      */
     eraseFeatures: function(features) {
         this.renderer.eraseFeatures(features);
@@ -32553,26 +32572,26 @@
      * Otherwise, return null.
      *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      *
      * Returns:
      * {<OpenLayers.Feature.Vector>} A feature if one was under the event.
      */
     getFeatureFromEvent: function(evt) {
         if (!this.renderer) {
-            OpenLayers.Console.error(OpenLayers.i18n("getFeatureError")); 
+            OpenLayers.Console.error(OpenLayers.i18n("getFeatureError"));
             return null;
-        }    
+        }
         var featureId = this.renderer.getFeatureIdFromEvent(evt);
         return this.getFeatureById(featureId);
     },
-    
+
     /**
      * APIMethod: getFeatureById
      * Given a feature id, return the feature if it exists in the features array
      *
      * Parameters:
-     * featureId - {String} 
+     * featureId - {String}
      *
      * Returns:
      * {<OpenLayers.Feature.Vector>} A feature corresponding to the given
@@ -32589,7 +32608,7 @@
         }
         return feature;
     },
-    
+
     /**
      * Unselect the selected features
      * i.e. clears the featureSelection array
@@ -32612,12 +32631,12 @@
      * Does nothing by default. Override this if you
      * need to do something on feature updates.
      *
-     * Paarameters: 
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * Paarameters:
+     * feature - {<OpenLayers.Feature.Vector>}
      */
     onFeatureInsert: function(feature) {
     },
-    
+
     /**
      * APIMethod: preFeatureInsert
      * method called before a feature is inserted.
@@ -32626,15 +32645,15 @@
      * layer, but before they are drawn, such as adjust the style.
      *
      * Parameters:
-     * feature - {<OpenLayers.Feature.Vector>} 
+     * feature - {<OpenLayers.Feature.Vector>}
      */
     preFeatureInsert: function(feature) {
     },
 
-    /** 
+    /**
      * APIMethod: getDataExtent
      * Calculates the max extent which includes all of the features.
-     * 
+     *
      * Returns:
      * {<OpenLayers.Bounds>}
      */
@@ -32691,13 +32710,13 @@
      * Create a new MultiPoint Geometry
      *
      * Parameters:
-     * components - {Array(<OpenLayers.Geometry.Point>)} 
+     * components - {Array(<OpenLayers.Geometry.Point>)}
      *
      * Returns:
      * {<OpenLayers.Geometry.MultiPoint>}
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -32712,7 +32731,7 @@
     addPoint: function(point, index) {
         this.addComponent(point, index);
     },
-    
+
     /**
      * APIMethod: removePoint
      * Wrapper for <OpenLayers.Geometry.Collection.removeComponent>
@@ -32748,12 +32767,12 @@
  *     called with each change in the sketch and will receive the latest point
  *     drawn.  Create a new instance with the <OpenLayers.Handler.Point>
  *     constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
-    
+
     /**
      * Property: point
      * {<OpenLayers.Feature.Vector>} The currently drawn point
@@ -32765,20 +32784,20 @@
      * {<OpenLayers.Layer.Vector>} The temporary drawing layer
      */
     layer: null,
-    
+
     /**
      * Property: multi
      * {Boolean} Cast features to multi-part geometries before passing to the
      *     layer.  Default is false.
      */
     multi: false,
-    
+
     /**
-     * Property: drawing 
+     * Property: drawing
      * {Boolean} A point is being drawn
      */
     drawing: false,
-    
+
     /**
      * Property: mouseDown
      * {Boolean} The mouse is down
@@ -32840,7 +32859,7 @@
 
         OpenLayers.Handler.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * APIMethod: activate
      * turn on the handler
@@ -32863,7 +32882,7 @@
         this.map.addLayer(this.layer);
         return true;
     },
-    
+
     /**
      * Method: createFeature
      * Add temporary features
@@ -32905,7 +32924,7 @@
         this.layer = null;
         return true;
     },
-    
+
     /**
      * Method: destroyFeature
      * Destroy the temporary geometries
@@ -32949,11 +32968,11 @@
      * Method: click
      * Handle clicks.  Clicks are stopped from propagating to other listeners
      *     on map.events or other dom elements.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     click: function(evt) {
@@ -32965,18 +32984,18 @@
      * Method: dblclick
      * Handle double-clicks.  Double-clicks are stopped from propagating to other
      *     listeners on map.events or other dom elements.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     dblclick: function(evt) {
         OpenLayers.Event.stop(evt);
         return false;
     },
-    
+
     /**
      * Method: modifyFeature
      * Modify the existing geometry given a pixel location.
@@ -33000,7 +33019,7 @@
     drawFeature: function() {
         this.layer.drawFeature(this.point, this.style);
     },
-    
+
     /**
      * Method: getGeometry
      * Return the sketch geometry.  If <multi> is true, this will return
@@ -33028,16 +33047,16 @@
         var geom = this.getGeometry();
         return geom && geom.clone();
     },
-  
+
     /**
      * Method: mousedown
      * Handle mouse down.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousedown: function(evt) {
@@ -33066,11 +33085,11 @@
      * Method: mousemove
      * Handle mouse move.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
@@ -33088,7 +33107,7 @@
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mouseup: function (evt) {
@@ -33116,37 +33135,37 @@
 
 /**
  * Class: OpenLayers.Geometry.Curve
- * A Curve is a MultiPoint, whose points are assumed to be connected. To 
- * this end, we provide a "getLength()" function, which iterates through 
- * the points, summing the distances between them. 
- * 
- * Inherits: 
+ * A Curve is a MultiPoint, whose points are assumed to be connected. To
+ * this end, we provide a "getLength()" function, which iterates through
+ * the points, summing the distances between them.
+ *
+ * Inherits:
  *  - <OpenLayers.Geometry.MultiPoint>
  */
 OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
 
     /**
      * Property: componentTypes
-     * {Array(String)} An array of class names representing the types of 
-     *                 components that the collection can include.  A null 
+     * {Array(String)} An array of class names representing the types of
+     *                 components that the collection can include.  A null
      *                 value means the component types are not restricted.
      */
     componentTypes: ["OpenLayers.Geometry.Point"],
 
     /**
      * Constructor: OpenLayers.Geometry.Curve
-     * 
+     *
      * Parameters:
      * point - {Array(<OpenLayers.Geometry.Point>)}
      */
     initialize: function(points) {
-        OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this,
                                                                   arguments);
     },
-    
+
     /**
      * APIMethod: getLength
-     * 
+     *
      * Returns:
      * {Float} The length of the curve
      */
@@ -33168,7 +33187,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Returns:
      * {Float} The appoximate geodesic length of the geometry in meters.
      */
@@ -33212,9 +33231,9 @@
 
 /**
  * Class: OpenLayers.Geometry.LineString
- * A LineString is a Curve which, once two points have been added to it, can 
+ * A LineString is a Curve which, once two points have been added to it, can
  * never be less than two points long.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Curve>
  */
@@ -33230,24 +33249,24 @@
      *
      */
     initialize: function(points) {
-        OpenLayers.Geometry.Curve.prototype.initialize.apply(this, arguments);        
+        OpenLayers.Geometry.Curve.prototype.initialize.apply(this, arguments);
     },
 
     /**
      * APIMethod: removeComponent
-     * Only allows removal of a point if there are three or more points in 
+     * Only allows removal of a point if there are three or more points in
      * the linestring. (otherwise the result would be just a single point)
      *
-     * Parameters: 
+     * Parameters:
      * point - {<OpenLayers.Geometry.Point>} The point to be removed
      */
     removeComponent: function(point) {
         if ( this.components && (this.components.length > 2)) {
-            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
                                                                   arguments);
         }
     },
-    
+
     /**
      * APIMethod: intersects
      * Test for instersection between two geometries.  This is a cheapo
@@ -33319,7 +33338,7 @@
         }
         return intersect;
     },
-    
+
     /**
      * Method: getSortedSegments
      *
@@ -33357,7 +33376,7 @@
         }
         return segments.sort(byX1);
     },
-    
+
     /**
      * Method: splitWithSegment
      * Split this geometry with the given segment.
@@ -33454,7 +33473,7 @@
     /**
      * Method: split
      * Use this geometry (the source) to attempt to split a target geometry.
-     * 
+     *
      * Parameters:
      * target - {<OpenLayers.Geometry>} The target geometry.
      * options - {Object} Properties of this object will be used to determine
@@ -33469,7 +33488,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -33573,7 +33592,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -33679,7 +33698,7 @@
             } else {
                 best = best.distance;
             }
-        } else if(geometry instanceof OpenLayers.Geometry.LineString) { 
+        } else if(geometry instanceof OpenLayers.Geometry.LineString) {
             var segs0 = this.getSortedSegments();
             var segs1 = geometry.getSortedSegments();
             var seg0, seg1, intersection, x0, y0;
@@ -33767,14 +33786,14 @@
 
 /**
  * Class: OpenLayers.Geometry.LinearRing
- * 
- * A Linear Ring is a special LineString which is closed. It closes itself 
+ *
+ * A Linear Ring is a special LineString which is closed. It closes itself
  * automatically on every addPoint/removePoint by adding a copy of the first
- * point as the last point. 
- * 
+ * point as the last point.
+ *
  * Also, as it is the first in the line family to close itself, a getArea()
  * function is defined to calculate the enclosed area of the linearRing
- * 
+ *
  * Inherits:
  *  - <OpenLayers.Geometry.LineString>
  */
@@ -33783,8 +33802,8 @@
 
     /**
      * Property: componentTypes
-     * {Array(String)} An array of class names representing the types of 
-     *                 components that the collection can include.  A null 
+     * {Array(String)} An array of class names representing the types of
+     *                 components that the collection can include.  A null
      *                 value means the component types are not restricted.
      */
     componentTypes: ["OpenLayers.Geometry.Point"],
@@ -33796,12 +33815,12 @@
      *     point does not equal the first point), the constructor will close
      *     the ring.  If the ring is already closed (the last point does equal
      *     the first point), it will be left closed.
-     * 
+     *
      * Parameters:
      * points - {Array(<OpenLayers.Geometry.Point>)} points
      */
     initialize: function(points) {
-        OpenLayers.Geometry.LineString.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.LineString.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -33809,16 +33828,16 @@
      * APIMethod: addComponent
      * Adds a point to geometry components.  If the point is to be added to
      *     the end of the components array and it is the same as the last point
-     *     already in that array, the duplicate point is not added.  This has 
-     *     the effect of closing the ring if it is not already closed, and 
-     *     doing the right thing if it is already closed.  This behavior can 
-     *     be overridden by calling the method with a non-null index as the 
+     *     already in that array, the duplicate point is not added.  This has
+     *     the effect of closing the ring if it is not already closed, and
+     *     doing the right thing if it is already closed.  This behavior can
+     *     be overridden by calling the method with a non-null index as the
      *     second argument.
      *
      * Parameter:
      * point - {<OpenLayers.Geometry.Point>}
      * index - {Integer} Index into the array to insert the component
-     * 
+     *
      * Returns:
      * {Boolean} Was the Point successfully added?
      */
@@ -33831,18 +33850,18 @@
         // given an index, add the point
         // without an index only add non-duplicate points
         if(index != null || !point.equals(lastPoint)) {
-            added = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+            added = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                     arguments);
         }
 
         //append copy of first point
         var firstPoint = this.components[0];
-        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                 [firstPoint]);
-        
+
         return added;
     },
-    
+
     /**
      * APIMethod: removeComponent
      * Removes a point from geometry components.
@@ -33855,17 +33874,17 @@
 
             //remove last point
             this.components.pop();
-            
+
             //remove our point
-            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
                                                                     arguments);
             //append copy of first point
             var firstPoint = this.components[0];
-            OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+            OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
                                                                 [firstPoint]);
         }
     },
-    
+
     /**
      * APIMethod: move
      * Moves a geometry by the given displacement along positive x and y axes.
@@ -33873,7 +33892,7 @@
      *     bounds.
      *
      * Parameters:
-     * x - {Float} Distance to move geometry in positive x direction. 
+     * x - {Float} Distance to move geometry in positive x direction.
      * y - {Float} Distance to move geometry in positive y direction.
      */
     move: function(x, y) {
@@ -33909,9 +33928,9 @@
      *                 will have four times the area).
      * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
      * ratio - {Float} Optional x:y ratio for resizing.  Default ratio is 1.
-     * 
+     *
      * Returns:
-     * {OpenLayers.Geometry} - The current geometry. 
+     * {OpenLayers.Geometry} - The current geometry.
      */
     resize: function(scale, origin, ratio) {
         for(var i=0, len=this.components.length; i<len - 1; ++i) {
@@ -33919,7 +33938,7 @@
         }
         return this;
     },
-    
+
     /**
      * APIMethod: transform
      * Reproject the components geometry from source to dest.
@@ -33927,9 +33946,9 @@
      * Parameters:
      * source - {<OpenLayers.Projection>}
      * dest - {<OpenLayers.Projection>}
-     * 
+     *
      * Returns:
-     * {<OpenLayers.Geometry>} 
+     * {<OpenLayers.Geometry>}
      */
     transform: function(source, dest) {
         if (source && dest) {
@@ -33941,7 +33960,7 @@
         }
         return this;
     },
-    
+
     /**
      * APIMethod: getCentroid
      *
@@ -33969,7 +33988,7 @@
      * APIMethod: getArea
      * Note - The area is positive if the ring is oriented CW, otherwise
      *         it will be negative.
-     * 
+     *
      * Returns:
      * {Float} The signed area for a ring.
      */
@@ -33986,7 +34005,7 @@
         }
         return area;
     },
-    
+
     /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
@@ -33997,7 +34016,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -34030,7 +34049,7 @@
         }
         return area;
     },
-    
+
     /**
      * Method: containsPoint
      * Test if a point is inside a linear ring.  For the case where a point
@@ -34062,7 +34081,7 @@
             end = this.components[i + 1];
             x2 = approx(end.x, digs);
             y2 = approx(end.y, digs);
-            
+
             /**
              * The following conditions enforce five edge-crossing rules:
              *    1. points coincident with edges are considered contained;
@@ -34188,10 +34207,10 @@
  * Class: OpenLayers.Geometry.MultiLineString
  * A MultiLineString is a geometry with multiple <OpenLayers.Geometry.LineString>
  * components.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Collection>
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.MultiLineString = OpenLayers.Class(
   OpenLayers.Geometry.Collection, {
@@ -34208,19 +34227,19 @@
      * Constructor: OpenLayers.Geometry.MultiLineString
      * Constructor for a MultiLineString Geometry.
      *
-     * Parameters: 
-     * components - {Array(<OpenLayers.Geometry.LineString>)} 
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry.LineString>)}
      *
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
-                                                                  arguments);        
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
+                                                                  arguments);
     },
-    
+
     /**
      * Method: split
      * Use this geometry (the source) to attempt to split a target geometry.
-     * 
+     *
      * Parameters:
      * target - {<OpenLayers.Geometry>} The target geometry.
      * options - {Object} Properties of this object will be used to determine
@@ -34235,7 +34254,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -34255,7 +34274,7 @@
         for(var i=0, len=this.components.length; i<len; ++i) {
             sourceLine = this.components[i];
             sourceSplit = false;
-            for(var j=0; j < targetParts.length; ++j) { 
+            for(var j=0; j < targetParts.length; ++j) {
                 splits = sourceLine.split(targetParts[j], options);
                 if(splits) {
                     if(mutual) {
@@ -34320,7 +34339,7 @@
         }
         return results;
     },
-    
+
     /**
      * Method: splitWith
      * Split this geometry (the target) with the given geometry (the source).
@@ -34340,7 +34359,7 @@
      * tolerance - {Number} If a non-null value is provided, intersections
      *     within the tolerance distance of an existing vertex on the source
      *     will be assumed to occur at the vertex.
-     * 
+     *
      * Returns:
      * {Array} A list of geometries (of this same type as the target) that
      *     result from splitting the target with the source geometry.  The
@@ -34390,7 +34409,7 @@
                                 );
                             }
                         }
-                        targetSplit = true;                    
+                        targetSplit = true;
                     }
                 }
                 if(!targetSplit) {
@@ -34408,7 +34427,7 @@
                             ])
                         ];
                     }
-                    
+
                 }
             }
         } else {
@@ -34460,13 +34479,13 @@
  *  - <OpenLayers.Handler.Point>
  */
 OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
-    
+
     /**
      * Property: line
      * {<OpenLayers.Feature.Vector>}
      */
     line: null,
-    
+
     /**
      * Property: freehand
      * {Boolean} In freehand mode, the handler starts the path on mouse down,
@@ -34475,7 +34494,7 @@
      * click and double-click finishes the path.
      */
     freehand: false,
-    
+
     /**
      * Property: freehandToggle
      * {String} If set, freehandToggle is checked on mouse events and will set
@@ -34510,7 +34529,7 @@
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.Point.prototype.initialize.apply(this, arguments);
     },
-        
+
     /**
      * Method: createFeature
      * Add temporary geometries
@@ -34531,7 +34550,7 @@
         this.point.geometry.clearBounds();
         this.layer.addFeatures([this.line, this.point], {silent: true});
     },
-        
+
     /**
      * Method: destroyFeature
      * Destroy temporary geometries
@@ -34550,7 +34569,7 @@
             this.layer.removeFeatures([this.point]);
         }
     },
-    
+
     /**
      * Method: addPoint
      * Add point to geometry.  Send the point index to override
@@ -34572,7 +34591,7 @@
         this.callback("modify", [this.point.geometry, this.getSketch()]);
         this.drawFeature();
     },
-    
+
     /**
      * Method: freehandMode
      * Determine whether to behave in freehand mode or not.
@@ -34642,11 +34661,11 @@
      * Method: mousedown
      * Handle mouse down.  Add a new point to the geometry and
      * render it. Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousedown: function(evt) {
@@ -34672,15 +34691,15 @@
      * Method: mousemove
      * Handle mouse move.  Adjust the geometry and redraw.
      * Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mousemove: function (evt) {
-        if(this.drawing) { 
+        if(this.drawing) {
             if(this.mouseDown && this.freehandMode(evt)) {
                 this.addPoint(evt.xy);
             } else {
@@ -34689,16 +34708,16 @@
         }
         return true;
     },
-    
+
     /**
      * Method: mouseup
      * Handle mouse up.  Send the latest point in the geometry to
      * the control. Return determines whether to propagate the event on the map.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     mouseup: function (evt) {
@@ -34717,16 +34736,16 @@
         }
         return true;
     },
-  
+
     /**
-     * Method: dblclick 
+     * Method: dblclick
      * Handle double-clicks.  Finish the geometry and send it back
      * to the control.
-     * 
+     *
      * Parameters:
      * evt - {Event} The browser event
      *
-     * Returns: 
+     * Returns:
      * {Boolean} Allow event propagation
      */
     dblclick: function(evt) {
@@ -34755,12 +34774,12 @@
  */
 
 /**
- * Class: OpenLayers.Geometry.Polygon 
- * Polygon is a collection of Geometry.LinearRings. 
- * 
+ * Class: OpenLayers.Geometry.Polygon
+ * Polygon is a collection of Geometry.LinearRings.
+ *
  * Inherits from:
- *  - <OpenLayers.Geometry.Collection> 
- *  - <OpenLayers.Geometry> 
+ *  - <OpenLayers.Geometry.Collection>
+ *  - <OpenLayers.Geometry>
  */
 OpenLayers.Geometry.Polygon = OpenLayers.Class(
   OpenLayers.Geometry.Collection, {
@@ -34775,24 +34794,24 @@
 
     /**
      * Constructor: OpenLayers.Geometry.Polygon
-     * Constructor for a Polygon geometry. 
-     * The first ring (this.component[0])is the outer bounds of the polygon and 
+     * Constructor for a Polygon geometry.
+     * The first ring (this.component[0])is the outer bounds of the polygon and
      * all subsequent rings (this.component[1-n]) are internal holes.
      *
      *
      * Parameters:
-     * components - {Array(<OpenLayers.Geometry.LinearRing>)} 
+     * components - {Array(<OpenLayers.Geometry.LinearRing>)}
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
-    
-    /** 
+
+    /**
      * APIMethod: getArea
-     * Calculated by subtracting the areas of the internal holes from the 
+     * Calculated by subtracting the areas of the internal holes from the
      *   area of the outer hole.
-     * 
+     *
      * Returns:
      * {float} The area of the geometry
      */
@@ -34807,7 +34826,7 @@
         return area;
     },
 
-    /** 
+    /**
      * APIMethod: getGeodesicArea
      * Calculate the approximate area of the polygon were it projected onto
      *     the earth.
@@ -34816,7 +34835,7 @@
      * projection - {<OpenLayers.Projection>} The spatial reference system
      *     for the geometry coordinates.  If not provided, Geographic/WGS84 is
      *     assumed.
-     * 
+     *
      * Reference:
      * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
      *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
@@ -34867,7 +34886,7 @@
                             } else {
                                 // in hole
                                 contained = false;
-                            }                            
+                            }
                             break;
                         }
                     }
@@ -34978,7 +34997,7 @@
 
 /**
  * APIMethod: createRegularPolygon
- * Create a regular polygon around a radius. Useful for creating circles 
+ * Create a regular polygon around a radius. Useful for creating circles
  * and the like.
  *
  * Parameters:
@@ -34987,7 +35006,7 @@
  * sides - {Integer} Number of sides. 20 approximates a circle.
  * rotation - {Float} original angle of rotation, in degrees.
  */
-OpenLayers.Geometry.Polygon.createRegularPolygon = function(origin, radius, sides, rotation) {  
+OpenLayers.Geometry.Polygon.createRegularPolygon = function(origin, radius, sides, rotation) {
     var angle = Math.PI * ((1/sides) - (1/2));
     if(rotation) {
         angle += (rotation / 180) * Math.PI;
@@ -35021,7 +35040,7 @@
  * MultiPolygon is a geometry with multiple <OpenLayers.Geometry.Polygon>
  * components.  Create a new instance with the <OpenLayers.Geometry.MultiPolygon>
  * constructor.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Geometry.Collection>
  */
@@ -35046,7 +35065,7 @@
      *
      */
     initialize: function(components) {
-        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this,
                                                                   arguments);
     },
 
@@ -35076,7 +35095,7 @@
  *  - <OpenLayers.Handler>
  */
 OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
-    
+
     /**
      * Parameter: polygon
      * {<OpenLayers.Feature.Vector>}
@@ -35108,7 +35127,7 @@
     initialize: function(control, callbacks, options) {
         OpenLayers.Handler.Path.prototype.initialize.apply(this, arguments);
     },
-    
+
     /**
      * Method: createFeature
      * Add temporary geometries
@@ -35150,7 +35169,7 @@
         this.layer.drawFeature(this.polygon, this.style);
         this.layer.drawFeature(this.point, this.style);
     },
-    
+
     /**
      * Method: getSketch
      * Return the sketch feature.
@@ -35182,9 +35201,9 @@
      * Method: dblclick
      * Handle double-clicks.  Finish the geometry and send it back
      * to the control.
-     * 
+     *
      * Parameters:
-     * evt - {Event} 
+     * evt - {Event}
      */
     dblclick: function(evt) {
         if(!this.freehandMode(evt)) {
@@ -35223,50 +35242,50 @@
  * Class: OpenLayers.Format.GML
  * Read/Wite GML. Create a new instance with the <OpenLayers.Format.GML>
  *     constructor.  Supports the GML simple features profile.
- * 
+ *
  * Inherits from:
  *  - <OpenLayers.Format>
  */
 OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format.XML, {
-    
+
     /*
      * APIProperty: featureNS
      * {String} Namespace used for feature attributes.  Default is
      *     "http://mapserver.gis.umn.edu/mapserver".
      */
     featureNS: "http://mapserver.gis.umn.edu/mapserver",
-    
+
     /**
      * APIProperty: featurePrefix
      * {String} Namespace alias (or prefix) for feature nodes.  Default is
      *     "feature".
      */
     featurePrefix: "feature",
-    
+
     /*
      * APIProperty: featureName
      * {String} Element name for features. Default is "featureMember".
      */
-    featureName: "featureMember", 
-    
+    featureName: "featureMember",
+
     /*
      * APIProperty: layerName
      * {String} Name of data layer. Default is "features".
      */
     layerName: "features",
-    
+
     /**
      * APIProperty: geometryName
      * {String} Name of geometry element.  Defaults to "geometry".
      */
     geometryName: "geometry",
-    
-    /** 
+
+    /**
      * APIProperty: collectionName
      * {String} Name of featureCollection element.
      */
     collectionName: "FeatureCollection",
-    
+
     /**
      * APIProperty: gmlns
      * {String} GML Namespace.
@@ -35278,14 +35297,14 @@
      * {Boolean} Extract attributes from GML.
      */
     extractAttributes: true,
-    
+
     /**
      * APIProperty: xy
      * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x)
      * Changing is not recommended, a new Format should be instantiated.
-     */ 
+     */
     xy: true,
-    
+
     /**
      * Constructor: OpenLayers.Format.GML
      * Create a new parser for GML.
@@ -35307,8 +35326,8 @@
 
     /**
      * APIMethod: read
-     * Read data from a string, and return a list of features. 
-     * 
+     * Read data from a string, and return a list of features.
+     *
      * Parameters:
      * data - {String} or {DOMElement} data to read/parse.
      *
@@ -35316,7 +35335,7 @@
      * {Array(<OpenLayers.Feature.Vector>)} An array of features.
      */
     read: function(data) {
-        if(typeof data == "string") { 
+        if(typeof data == "string") {
             data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
         }
         var featureNodes = this.getElementsByTagNameNS(data.documentElement,
@@ -35331,15 +35350,15 @@
         }
         return features;
     },
-    
+
     /**
      * Method: parseFeature
      * This function is the core of the GML parsing code in OpenLayers.
      *    It creates the geometries that are then attached to the returned
      *    feature, and calls parseAttributes() to get attribute data out.
-     *    
+     *
      * Parameters:
-     * node - {DOMElement} A GML feature node. 
+     * node - {DOMElement} A GML feature node.
      */
     parseFeature: function(node) {
         // only accept one geometry per feature - look for highest "order"
@@ -35356,9 +35375,9 @@
                 if(parser) {
                     geometry = parser.apply(this, [nodeList[0]]);
                     if (this.internalProjection && this.externalProjection) {
-                        geometry.transform(this.externalProjection, 
-                                           this.internalProjection); 
-                    }                       
+                        geometry.transform(this.externalProjection,
+                                           this.internalProjection);
+                    }
                 } else {
                     OpenLayers.Console.error(OpenLayers.i18n(
                                 "unsupportedGeometryType", {'geomType':type}));
@@ -35367,20 +35386,20 @@
                 break;
             }
         }
-        
+
         // construct feature (optionally with attributes)
         var attributes;
         if(this.extractAttributes) {
             attributes = this.parseAttributes(node);
         }
         var feature = new OpenLayers.Feature.Vector(geometry, attributes);
-        
+
         feature.gml = {
             featureType: node.firstChild.nodeName.split(":")[1],
             featureNS: node.firstChild.namespaceURI,
             featureNSPrefix: node.firstChild.prefix
         };
-                
+
         // assign fid - this can come from a "fid" or "id" attribute
         var childNode = node.firstChild;
         var fid;
@@ -35397,14 +35416,14 @@
         feature.fid = fid;
         return feature;
     },
-    
+
     /**
      * Property: parseGeometry
      * Properties of this object are the functions that parse geometries based
      *     on their type.
      */
     parseGeometry: {
-        
+
         /**
          * Method: parseGeometry.point
          * Given a GML node representing a point geometry, create an OpenLayers
@@ -35461,12 +35480,12 @@
                     }
                 }
             }
-                
+
             // preserve third dimension
             if(coords.length == 2) {
                 coords[2] = null;
             }
-            
+
             if (this.xy) {
                 return new OpenLayers.Geometry.Point(coords[0], coords[1],
                                                  coords[2]);
@@ -35476,7 +35495,7 @@
                                                  coords[2]);
             }
         },
-        
+
         /**
          * Method: parseGeometry.multipoint
          * Given a GML node representing a multipoint geometry, create an
@@ -35503,7 +35522,7 @@
             }
             return new OpenLayers.Geometry.MultiPoint(components);
         },
-        
+
         /**
          * Method: parseGeometry.linestring
          * Given a GML node representing a linestring geometry, create an
@@ -35585,7 +35604,7 @@
             }
             return line;
         },
-        
+
         /**
          * Method: parseGeometry.multilinestring
          * Given a GML node representing a multilinestring geometry, create an
@@ -35613,7 +35632,7 @@
             }
             return new OpenLayers.Geometry.MultiLineString(components);
         },
-        
+
         /**
          * Method: parseGeometry.polygon
          * Given a GML node representing a polygon geometry, create an
@@ -35642,7 +35661,7 @@
             }
             return new OpenLayers.Geometry.Polygon(components);
         },
-        
+
         /**
          * Method: parseGeometry.multipolygon
          * Given a GML node representing a multipolygon geometry, create an
@@ -35670,22 +35689,22 @@
             }
             return new OpenLayers.Geometry.MultiPolygon(components);
         },
-        
+
         envelope: function(node) {
             var components = [];
             var coordString;
             var envelope;
-            
+
             var lpoint = this.getElementsByTagNameNS(node, this.gmlns, "lowerCorner");
             if (lpoint.length > 0) {
                 var coords = [];
-                
+
                 if(lpoint.length > 0) {
                     coordString = lpoint[0].firstChild.nodeValue;
                     coordString = coordString.replace(this.regExes.trimSpace, "");
                     coords = coordString.split(this.regExes.splitSpace);
                 }
-                
+
                 if(coords.length == 2) {
                     coords[2] = null;
                 }
@@ -35695,17 +35714,17 @@
                     var lowerPoint = new OpenLayers.Geometry.Point(coords[1], coords[0],coords[2]);
                 }
             }
-            
+
             var upoint = this.getElementsByTagNameNS(node, this.gmlns, "upperCorner");
             if (upoint.length > 0) {
                 var coords = [];
-                
+
                 if(upoint.length > 0) {
                     coordString = upoint[0].firstChild.nodeValue;
                     coordString = coordString.replace(this.regExes.trimSpace, "");
                     coords = coordString.split(this.regExes.splitSpace);
                 }
-                
+
                 if(coords.length == 2) {
                     coords[2] = null;
                 }
@@ -35715,21 +35734,21 @@
                     var upperPoint = new OpenLayers.Geometry.Point(coords[1], coords[0],coords[2]);
                 }
             }
-            
+
             if (lowerPoint && upperPoint) {
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, lowerPoint.y));
                 components.push(new OpenLayers.Geometry.Point(upperPoint.x, lowerPoint.y));
                 components.push(new OpenLayers.Geometry.Point(upperPoint.x, upperPoint.y));
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, upperPoint.y));
                 components.push(new OpenLayers.Geometry.Point(lowerPoint.x, lowerPoint.y));
-                
+
                 var ring = new OpenLayers.Geometry.LinearRing(components);
                 envelope = new OpenLayers.Geometry.Polygon([ring]);
             }
-            return envelope; 
+            return envelope;
         }
     },
-    
+
     /**
      * Method: parseAttributes
      *
@@ -35778,11 +35797,11 @@
         }
         return attributes;
     },
-    
+
     /**
      * APIMethod: write
-     * Generate a GML document string given a list of features. 
-     * 
+     * Generate a GML document string given a list of features.
+     *
      * Parameters:
      * features - {Array(<OpenLayers.Feature.Vector>)} List of features to
      *     serialize into a string.
@@ -35802,7 +35821,7 @@
         return OpenLayers.Format.XML.prototype.write.apply(this, [gml]);
     },
 
-    /** 
+    /**
      * Method: createFeatureXML
      * Accept an OpenLayers.Feature.Vector, and build a GML node for it.
      *
@@ -35828,27 +35847,27 @@
         featureContainer.setAttribute("fid", fid);
         featureContainer.appendChild(geomContainer);
         for(var attr in feature.attributes) {
-            var attrText = this.createTextNode(feature.attributes[attr]); 
+            var attrText = this.createTextNode(feature.attributes[attr]);
             var nodename = attr.substring(attr.lastIndexOf(":") + 1);
             var attrContainer = this.createElementNS(this.featureNS,
                                                      this.featurePrefix + ":" +
                                                      nodename);
             attrContainer.appendChild(attrText);
             featureContainer.appendChild(attrContainer);
-        }    
+        }
         featureNode.appendChild(featureContainer);
         return featureNode;
     },
-    
+
     /**
      * APIMethod: buildGeometryNode
      */
     buildGeometryNode: function(geometry) {
         if (this.externalProjection && this.internalProjection) {
             geometry = geometry.clone();
-            geometry.transform(this.internalProjection, 
+            geometry.transform(this.internalProjection,
                                this.externalProjection);
-        }    
+        }
         var className = geometry.CLASS_NAME;
         var type = className.substring(className.lastIndexOf(".") + 1);
         var builder = this.buildGeometry[type.toLowerCase()];
@@ -35881,7 +35900,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multipoint
          * Given an OpenLayers multipoint geometry, create a GML multipoint.
@@ -35896,7 +35915,7 @@
             var gml = this.createElementNS(this.gmlns, "gml:MultiPoint");
             var points = geometry.components;
             var pointMember, pointGeom;
-            for(var i=0; i<points.length; i++) { 
+            for(var i=0; i<points.length; i++) {
                 pointMember = this.createElementNS(this.gmlns,
                                                    "gml:pointMember");
                 pointGeom = this.buildGeometry.point.apply(this,
@@ -35904,9 +35923,9 @@
                 pointMember.appendChild(pointGeom);
                 gml.appendChild(pointMember);
             }
-            return gml;            
+            return gml;
         },
-        
+
         /**
          * Method: buildGeometry.linestring
          * Given an OpenLayers linestring geometry, create a GML linestring.
@@ -35922,7 +35941,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multilinestring
          * Given an OpenLayers multilinestring geometry, create a GML
@@ -35949,7 +35968,7 @@
             }
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.linearring
          * Given an OpenLayers linearring geometry, create a GML linearring.
@@ -35965,7 +35984,7 @@
             gml.appendChild(this.buildCoordinatesNode(geometry));
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.polygon
          * Given an OpenLayers polygon geometry, create a GML polygon.
@@ -35991,7 +36010,7 @@
             }
             return gml;
         },
-        
+
         /**
          * Method: buildGeometry.multipolygon
          * Given an OpenLayers multipolygon geometry, create a GML multipolygon.
@@ -36018,7 +36037,7 @@
             return gml;
 
         },
- 
+
         /**
          * Method: buildGeometry.bounds
          * Given an OpenLayers bounds, create a GML box.
@@ -36042,8 +36061,8 @@
      * (code)
      * <gml:coordinates decimal="." cs="," ts=" ">...</gml:coordinates>
      * (end)
-     * Parameters: 
-     * geometry - {<OpenLayers.Geometry>} 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
      *
      * Returns:
      * {XmlNode} created xmlNode
@@ -36063,17 +36082,17 @@
         } else {
             var points = (geometry.components) ? geometry.components : [geometry];
             for(var i=0; i<points.length; i++) {
-                parts.push(points[i].x + "," + points[i].y);                
-            }            
+                parts.push(points[i].x + "," + points[i].y);
+            }
         }
 
         var txtNode = this.createTextNode(parts.join(" "));
         coordinatesNode.appendChild(txtNode);
-        
+
         return coordinatesNode;
     },
 
-    CLASS_NAME: "OpenLayers.Format.GML" 
+    CLASS_NAME: "OpenLayers.Format.GML"
 });
 /* ======================================================================
     OpenLayers/Format/GML/Base.js
@@ -36104,7 +36123,7 @@
  *  - <OpenLayers.Format.XML>
  */
 OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
-    
+
     /**
      * Property: namespaces
      * {Object} Mapping of namespace aliases to namespace URIs.
@@ -36115,7 +36134,7 @@
         xsi: "http://www.w3.org/2001/XMLSchema-instance",
         wfs: "http://www.opengis.net/wfs" // this is a convenience for reading wfs:FeatureCollection
     },
-    
+
     /**
      * Property: defaultPrefix
      */
@@ -36126,13 +36145,13 @@
      * {String} Schema location for a particular minor version.
      */
     schemaLocation: null,
-    
+
     /**
      * APIProperty: featureType
      * {Array(String) or String} The local (without prefix) feature typeName(s).
      */
     featureType: null,
-    
+
     /**
      * APIProperty: featureNS
      * {String} The feature namespace.  Must be set in the options at
@@ -36151,7 +36170,7 @@
      * {Boolean} Extract attributes from GML.  Default is true.
      */
     extractAttributes: true,
-    
+
     /**
      * APIProperty: srsName
      * {String} URI for spatial reference system.  This is optional for
@@ -36165,7 +36184,7 @@
      * APIProperty: xy
      * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x)
      * Changing is not recommended, a new Format should be instantiated.
-     */ 
+     */
     xy: true,
 
     /**
@@ -36204,7 +36223,7 @@
      *     this instance.
      *
      * Valid options properties:
-     * featureType - {Array(String) or String} Local (without prefix) feature 
+     * featureType - {Array(String) or String} Local (without prefix) feature
      *     typeName(s) (required).
      * featureNS - {String} Feature namespace (required).
      * geometryName - {String} Geometry element name.
@@ -36217,7 +36236,7 @@
         }
         this.singleFeatureType = !options || (typeof options.featureType === "string");
     },
-    
+
     /**
      * Method: read
      *
@@ -36229,7 +36248,7 @@
      * {Array(<OpenLayers.Feature.Vector>)} An array of features.
      */
     read: function(data) {
-        if(typeof data == "string") { 
+        if(typeof data == "string") {
             data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
         }
         if(data && data.nodeType == 9) {
@@ -36259,7 +36278,7 @@
         }
         return features;
     },
-    
+
     /**
      * Property: readers
      * Contains public functions, grouped by namespace prefix, that will
@@ -36274,7 +36293,7 @@
                 this.readChildNodes(node, obj);
             },
             "featureMembers": function(node, obj) {
-                this.readChildNodes(node, obj);                
+                this.readChildNodes(node, obj);
             },
             "name": function(node, obj) {
                 obj.name = this.getChildValue(node);
@@ -36412,7 +36431,7 @@
                 // geometry or attributes.
                 var name;
                 var local = node.localName || node.nodeName.split(":").pop();
-                if (!this.singleFeatureType && 
+                if (!this.singleFeatureType &&
                     (OpenLayers.Util.indexOf(this.featureType, local) != -1)) {
                         name = "_typeName";
                 }
@@ -36479,7 +36498,7 @@
             }
         }
     },
-    
+
     /**
      * Method: write
      *
@@ -36507,7 +36526,7 @@
 
         return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
     },
-    
+
     /**
      * Property: writers
      * As a compliment to the readers property, this structure contains public
@@ -36597,7 +36616,7 @@
                     geometry = geometry.clone().transform(
                         this.internalProjection, this.externalProjection
                     );
-                }    
+                }
                 var node = this.createElementNSPlus(
                     "feature:" + this.geometryName
                 );
@@ -36631,7 +36650,7 @@
             }
         }
     },
-    
+
     /**
      * Function: setGeometryTypes
      * Sets the <geometryTypes> mapping.
@@ -36648,7 +36667,7 @@
         };
     },
 
-    CLASS_NAME: "OpenLayers.Format.GML.Base" 
+    CLASS_NAME: "OpenLayers.Format.GML.Base"
 
 });
 /* ======================================================================
@@ -36671,7 +36690,7 @@
  *  - <OpenLayers.Format.GML.Base>
  */
 OpenLayers.Format.GML.v2 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
-    
+
     /**
      * Property: schemaLocation
      * {String} Schema location for a particular minor version.
@@ -36843,9 +36862,9 @@
         "feature": OpenLayers.Format.GML.Base.prototype.writers["feature"],
         "wfs": OpenLayers.Format.GML.Base.prototype.writers["wfs"]
     },
-    
-    CLASS_NAME: "OpenLayers.Format.GML.v2" 
 
+    CLASS_NAME: "OpenLayers.Format.GML.v2"
+
 });
 /* ======================================================================
     OpenLayers/Format/GML/v3.js
@@ -36867,7 +36886,7 @@
  *  - <OpenLayers.Format.GML.Base>
  */
 OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
-    
+
     /**
      * Property: schemaLocation
      * {String} Schema location for a particular minor version.  The writers
@@ -36884,7 +36903,7 @@
      *     instantiation).
      */
     curve: false,
-    
+
     /**
      * Property: multiCurve
      * {Boolean} Write gml:MultiCurve instead of gml:MultiLineString.  Since
@@ -36894,7 +36913,7 @@
      *     instantiation).
      */
     multiCurve: true,
-    
+
     /**
      * Property: surface
      * {Boolean} Write gml:Surface instead of gml:Polygon elements.  This also
@@ -37083,11 +37102,11 @@
                 this.readers.gml.pos.apply(this, [node, obj]);
                 container.points[1] = obj.points[0];
             }
-        }, OpenLayers.Format.GML.Base.prototype.readers["gml"]),            
+        }, OpenLayers.Format.GML.Base.prototype.readers["gml"]),
         "feature": OpenLayers.Format.GML.Base.prototype.readers["feature"],
         "wfs": OpenLayers.Format.GML.Base.prototype.readers["wfs"]
     },
-    
+
     /**
      * Method: write
      *
@@ -37179,7 +37198,7 @@
                 }
                 return this.createElementNSPlus("gml:posList", {
                     value: parts.join(" ")
-                }); 
+                });
             },
             "Surface": function(geometry) {
                 var node = this.createElementNSPlus("gml:Surface");
@@ -37308,7 +37327,7 @@
             "OpenLayers.Geometry.Collection": "GeometryCollection"
         };
     },
-    
-    CLASS_NAME: "OpenLayers.Format.GML.v3" 
 
+    CLASS_NAME: "OpenLayers.Format.GML.v3"
+
 });



More information about the fusion-commits mailing list